SUBSTR 标量函数
SUBSTR 函数返回字符串的子串。
该模式是 SYSIBM。
- 字符串
- 输入表达式,用于指定要从中派生子串的字符串。 表达式必须返回作为内置字符串,数字值,布尔值或日期时间值的值。 如果该值不是字符串,那么在对函数求值之前,会将其隐式强制类型转换为 VARCHAR。 此表达式的任何数字 (零个或多个) 连续字符串单元构成此表达式的子串。 start
- 一个表达式,用于指定要从中计算子串的位置 (相对于输入表达式的开头)。 例如:
- 位置 1 是输入表达式的第一个字符串单位。 语句
SUBSTR('abcd',1,2)将会返回'ab'。 - 位置 2 是位置 1 右侧的第一个位置。 语句
SUBSTR('abcd',2,2)将会返回'bc'。
length - 位置 1 是输入表达式的第一个字符串单位。 语句
- 用于指定结果长度的表达式。 如果指定了此参数,那么表达式必须返回内置数字, 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 函数的结果类型和长度取决于其输入的类型和属性。
| 字符串参数数据类型 | 长度参数 | 结果数据类型 |
|---|---|---|
| CHAR (A) | constant (L<N) If the units of 字符串 are:
|
CHAR (l) |
| CHAR (A) | 未指定,但 start 自变量是常量 | CHAR (A-start+ 1) |
| CHAR (A) | 不是常量 | VARCHAR (A) |
| VARCHAR (A) | constant (L<N) If the units of 字符串 are:
|
CHAR (l) |
| VARCHAR (A) | constant (M<L<N) If the units of 字符串 are:
|
VARCHAR (l) |
| VARCHAR (A) | 不是常量或未指定 | VARCHAR (A) |
| CLOB (A) | 常量 (l) | CLOB (l) |
| CLOB (A) | 不是常量或未指定 | CLOB (A) |
| 图形 (A) | constant (L<N) If the units of 字符串 are:
|
GRAPHIC (l) |
| 图形 (A) | 未指定,但 start 自变量是常量 | GRAPHIC (A-启动+ 1) |
| 图形 (A) | 不是常量 | VARGRAPHIC (A) |
| VARGRAPHIC (A) | constant (L<N) If the units of 字符串 are:
|
GRAPHIC (l) |
| VARGRAPHIC (A) | constant (M<L<N) If the units of 字符串 are:
|
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 中,可以使用参数标记来表示 string, start和 length 。 如果将参数标记用于 string,那么操作数的数据类型将为 VARCHAR ,并且操作数将为可空。
- 尽管在前面提到的结果定义中没有明确说明,但语义暗示如果 string 是混合的单字节和多字节字符串,那么结果可能包含多字节字符的片段,具体取决于 start 和 length的值。 例如,结果可能以多字节字符的第二个字节开始,或以多字节字符的第一个字节结束。 SUBSTR 函数不会检测此类片段,也不会在这些片段发生时提供任何特殊处理。
示例
- 示例 1: 假定主变量
NAME (VARCHAR(50))具有值'BLUE JAY':- 以下语句返回值
'BLUE':SUBSTR(:NAME,1,4) - 以下语句返回值
'JAY':SUBSTR(:NAME,6) - 以下语句返回值
'JA':SUBSTR(:NAME,6,2)
- 以下语句返回值
- 示例 2: 从项目表中选择项目名称 (PROJNAME) 以单词 "OPERATION" 开头的所有行。
常量末尾的空格是排除诸如 "OPER国际" 之类的词所必需的。SELECT * FROM PROJECT WHERE SUBSTR(PROJNAME,1,10) = 'OPERATION '
