SUBSTR 标量函数 (scalar function)

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

阅读语法图跳过可视化语法图SUBSTR( 字符串表达式, start, 长度)

该模式是 SYSIBM。

字符串表达式
用于指定结果所来自的字符串的表达式。 字符串必须是一个字符、图形或二进制字符串。 如果字符串表达式是一个字符串,则函数的结果也是一个字符串。 如果是一个图形字符串,则函数的计算结果也是一个图形字符串。 如果是一个二进制字符串,则函数的返回结果也是一个二进制字符串。

该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。

字符串表达式的子串是字符串表达式中零个或多个连续字符。 如果字符串表达式是图形字符串,则字符是DBCS字符。 如果字符串表达式是一个字符串或二进制字符串,则一个字符就是一个字节。 SUBSTR函数接受混合数据字符串。 然而,由于SUBSTR以严格的字节计数为基础,因此结果不一定是正确格式的混合数据字符串。

start
一个表达式,指定在字符串表达式中的位置为结果的第一个字符。 整数的值必须在1到字符串表达式的长度属性之间。 (可变长度字符串的长度属性是其最大长度。) 值为1表示子字符串的第一个字符是字符串表达式的第一个字符。

参数也可以是字符串或图形字符串数据类型。 字符串输入隐式转换为DECFLOAT(34)的数值,然后赋值给INTEGER。

length
用于指定子字符串长度的表达式。 如果指定,则长度必须是一个返回内置大整数数据类型的值的表达式。

参数也可以是字符串或图形字符串数据类型。 字符串输入隐式转换为DECFLOAT(34)的数值,然后赋值给INTEGER。

该值必须大于或等于0且小于或等于 n ,其中 nstring-expression - start + 1 的长度属性。 但是,指定的长度不能是整数常数0。

如果明确指定了长度 ,则字符串表达式在右侧会有效填充必要数量的字符,以确保字符串表达式的指定子字符串始终存在。 当字符串表达式为二进制数据时,十六进制零用作填充字符。 否则,将使用空格作为填充字符。

如果字符串表达式是固定长度的字符串,则省略长度LENGTH(string-expression) - start + 1 的隐式指定,即从start指定的字符(或字节)到字符串表达式的最后一个字符(或字节)之间的字符数(或字节数)。 如果字符串表达式是一个长度可变的字符串,则省略长度隐式指定长度为0或 LENGTH(string-expression) - start + 1 中的较大值。 如果结果长度为零,则结果为空字符串。

如果长度由255或更小的整数常量明确指定,并且字符串表达式不是LOB,则结果是一个固定长度的字符串,其长度属性为length。 如果未明确指定长度 ,但字符串表达式是固定长度的字符串,并且 start 是一个整数常量,则结果是一个固定长度的字符串,其长度属性等于 LENGTH(string-expression) - start + 1。 在其他情况下,结果是一个长度不定的字符串。 如果长度由一个大的整数常量明确指定,则结果的长度属性为 length;否则,结果的长度属性与字符串表达式的长度属性相同。

结果可以为空; 如果任何自变量为空,那么结果为空值。

结果的CCSID是字符串表达式的 CCSID。

SUBSTR 的示例

  • 示例1: FIRSTNME是示例表 DSN8C10.EMP 中的VARCHAR(12)列。 当FIRSTNME的值为“MAUDE”时:

       Function:                 Returns:
       -----------------------------------
       SUBSTR(FIRSTNME,2,3)      -- 'AUD'
       SUBSTR(FIRSTNME,2)        -- 'AUDE'
       SUBSTR(FIRSTNME,2,6)      -- 'AUDE' followed by two blanks
       SUBSTR(FIRSTNME,6)        -- a zero-length string
       SUBSTR(FIRSTNME,6,4)      -- four blanks
  • 示例 2 :DSN8C10.PROJ 示例表包含 PROJNAME 列,该列定义为 VARCHAR(24)。 选择表中所有PROJNAME中的字符串以“W L PROGRAM”开头的行。

       SELECT * FROM DSN8C10.PROJ
         WHERE SUBSTR(PROJNAME,1,12) = 'W L PROGRAM ';

    假设表中只有 Db2 提供的行。 然后,谓词仅对一行成立,该行中的项目名称值为“W L PROGRAM DESIGN”。 对于PROJNAME值为“W L PROGRAMMING”的行,谓词不成立,因为谓词的字符串常量中“PROGRAM”后面有一个空格。

  • 示例3 :假设名为 my_loc 的LOB定位器代表一个长度为1GB的LOB值。 将LOB值的前50个字节赋给主机变量PORTION

       SET :PORTION = SUBSTR(:my_loc,1,50);
  • 示例4 :假设宿主变量 RESUME 具有CLOB数据类型,并保存着员工的简历。 这个例子显示了一些语句,这些语句在简历中找到部门信息部分并将其赋值给主变量 DeptBuf。 首先,POSSTR函数用于查找部门信息的开始和结束位置。 在简历中,部门信息以“部门信息部分”开头,在“教育部分”之前结束。 然后,SUBSTR函数使用这些开始和结束位置将信息分配给主变量。

       SET :DInfoBegPos = POSSTR(:RESUME, 'Department Information Section');
       SET :DInfoEnPos = POSSTR(:RESUME, 'Education Section');
       SET :DeptBuf = SUBSTR(:RESUME, :DInfoBegPos, :DInfoEnPos - :DInfoBegPos);