SUBSTR 标量函数

SUBSTR 函数返回字符串的子串。

Read syntax diagramSkip visual syntax diagramSUBSTR(string, start,length)

该模式是 SYSIBM。

字符串
输入表达式,用于指定要从中派生子串的字符串。 表达式必须返回作为内置字符串,数字值,布尔值或日期时间值的值。 如果该值不是字符串,那么在对函数求值之前,会将其隐式强制类型转换为 VARCHAR。 此表达式的任何数字 (零个或多个) 连续字符串单元构成此表达式的子串。
start
一个表达式,用于指定要从中计算子串的位置 (相对于输入表达式的开头)。 例如:
  • 位置 1 是输入表达式的第一个字符串单位。 语句 SUBSTR('abcd',1,2) 将会返回 'ab'
  • 位置 2 是位置 1 右侧的第一个位置。 语句 SUBSTR('abcd',2,2) 将会返回 'bc'
表达式必须返回内置数字, CHAR , VARCHAR , GRAPHIC 或 VARGRAPHIC 值。 如果该值不是 INTEGER 类型,那么在对该函数求值之前,会将其隐式强制类型转换为 INTEGER。
length
用于指定结果长度的表达式。 如果指定了此参数,那么表达式必须返回内置数字, CHAR , VARCHAR , GRAPHIC 或 VARGRAPHIC 数据类型的值。 如果该值不是 INTEGER 类型,那么在对该函数求值之前,会将其隐式强制类型转换为 INTEGER。 整数的值必须在 0 到 N的范围内,其中 N 等于 ( 字符串 在字符串单元中的长度属性)- 启动 + 1 (如果超出范围,那么为 SQLSTATE 22011)。

如果显式指定了 length ,那么将在右侧有效填充 字符串 ,其中包含必需数量的空白字符 (单字节表示字符串; 双字节表示图形字符串) 或十六进制零字符 (表示二进制字符串) ,以便 指定的子串存在。 缺省长度是从 启动 指定的字符串单元到 字符串的最后 字符串单元字符串单元 的数目。 但是,如果 string 是长度小于 start的变长字符串,那么缺省值为零,结果为空字符串。 它必须在数据库代码页 (而不是应用程序代码页) 的上下文中指定为 string units 的数目。 (例如,数据类型为 VARCHAR (18) 且值为 "MCKNIGHT" 的列 NAME 将生成带有 SUBSTR(NAME,10)的空字符串)。

如果 string 为:
  • 固定长度字符串,缺省长度为 LENGTH(string) - start + 1
  • 变长字符串,缺省长度为零或 LENGTH(string) - start + 1,以较大者为准。

结果

如果 string 是字符串,那么结果是在其第一个自变量的代码页 和字符串单元 中表示的字符串。 如果是二进制字符串,那么结果是二进制字符串。 如果它是图形字符串,那么结果是在其第一个自变量的代码页 和字符串单元 中表示的图形字符串。 如果第一个自变量是不是二进制字符串且不是 FOR BIT DATA 字符串的主变量,那么结果的代码页是数据库代码页。 如果 SUBSTR 函数的任何自变量可以为空,那么结果可以为空; 如果任何自变量为空,那么结果为空值。

表 1 显示 SUBSTR 函数的结果类型和长度取决于其输入的类型和属性。

表 1. SUBSTR 结果的数据类型和长度
字符串参数数据类型 长度参数 结果数据类型
CHAR (A) constant (L<N)
If the units of 字符串 are:
  • OCTETS , n= 256
  • CODEUNITS32, n= 64
CHAR (l)
CHAR (A) 未指定,但 start 自变量是常量 CHAR (A-start+ 1)
CHAR (A) 不是常量 VARCHAR (A)
VARCHAR (A) constant (L<N)
If the units of 字符串 are:
  • OCTETS , n= 256
  • CODEUNITS32, n= 64
CHAR (l)
VARCHAR (A) constant (M<L<N)
If the units of 字符串 are:
  • OCTETS , m= 256 , n= 32673
  • CODEUNITS32, m= 63 , n= 8169
VARCHAR (l)
VARCHAR (A) 不是常量或未指定 VARCHAR (A)
CLOB (A) 常量 (l) CLOB (l)
CLOB (A) 不是常量或未指定 CLOB (A)
图形 (A) constant (L<N)
If the units of 字符串 are:
  • 双字节或 CODEUNITS16, n= 128
  • CODEUNITS32, n= 64
GRAPHIC (l)
图形 (A) 未指定,但 start 自变量是常量 GRAPHIC (A-启动+ 1)
图形 (A) 不是常量 VARGRAPHIC (A)
VARGRAPHIC (A) constant (L<N)
If the units of 字符串 are:
  • 双字节或 CODEUNITS16, n= 128
  • CODEUNITS32, n= 64
GRAPHIC (l)
VARGRAPHIC (A) constant (M<L<N)
If the units of 字符串 are:
  • 双字节或 CODEUNITS16, m= 127 和 n= 16337
  • CODEUNITS32, m= 63 , n= 8169
VARGRAPHIC (l)
VARGRAPHIC (A) 不是常量 VARGRAPHIC (A)
DBCLOB (A) 常量 (l) DBCLOB (l)
DBCLOB (A) 不是常量或未指定 DBCLOB (A)
BINARY (A) constant (L<256) BINARY (l)
BINARY (A) 未指定,但 start 自变量是常量 BINARY (A-start+ 1)
BINARY (A) 不是常量 VARBINARY (A)
VARBINARY (A) constant (L<256) BINARY (l)
VARBINARY (A) constant (255<L<32673) VARBINARY (l)
VARBINARY (A) 不是常量或未指定 VARBINARY (A)
BLOB (A) 常量 (l) BLOB (l)
BLOB (A) 不是常量或未指定 BLOB (A)
注: LONG VARCHAR 和 LONG VARGRAPHIC 数据类型继续受支持,但不推荐使用并且不建议使用。

注意

  • 在动态 SQL 中,可以使用参数标记来表示 stringstartlength 。 如果将参数标记用于 string,那么操作数的数据类型将为 VARCHAR ,并且操作数将为可空。
  • 尽管在前面提到的结果定义中没有明确说明,但语义暗示如果 string 是混合的单字节和多字节字符串,那么结果可能包含多字节字符的片段,具体取决于 startlength的值。 例如,结果可能以多字节字符的第二个字节开始,或以多字节字符的第一个字节结束。 SUBSTR 函数不会检测此类片段,也不会在这些片段发生时提供任何特殊处理。

示例

  • 示例 1: 假定主变量 NAME (VARCHAR(50)) 具有值 'BLUE JAY':
    • 以下语句返回值 'BLUE':
         SUBSTR(:NAME,1,4)
    • 以下语句返回值 'JAY':
         SUBSTR(:NAME,6)
    • 以下语句返回值 'JA':
         SUBSTR(:NAME,6,2)
  • 示例 2: 从项目表中选择项目名称 (PROJNAME) 以单词 "OPERATION" 开头的所有行。
       SELECT * FROM PROJECT
         WHERE SUBSTR(PROJNAME,1,10) = 'OPERATION '
    常量末尾的空格是排除诸如 "OPER国际" 之类的词所必需的。