SUBSTR 标量函数 (scalar function)
SUBSTR函数用于返回字符串的子字符串。
该模式是 SYSIBM。
- 字符串表达式
- 用于指定结果所来自的字符串的表达式。 字符串必须是一个字符、图形或二进制字符串。 如果字符串表达式是一个字符串,则函数的结果也是一个字符串。 如果是一个图形字符串,则函数的计算结果也是一个图形字符串。 如果是一个二进制字符串,则函数的返回结果也是一个二进制字符串。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
字符串表达式的子串是字符串表达式中零个或多个连续字符。 如果字符串表达式是图形字符串,则字符是DBCS字符。 如果字符串表达式是一个字符串或二进制字符串,则一个字符就是一个字节。 SUBSTR函数接受混合数据字符串。 然而,由于SUBSTR以严格的字节计数为基础,因此结果不一定是正确格式的混合数据字符串。
- start
- 一个表达式,指定在字符串表达式中的位置为结果的第一个字符。 整数的值必须在1到字符串表达式的长度属性之间。 (可变长度字符串的长度属性是其最大长度。) 值为1表示子字符串的第一个字符是字符串表达式的第一个字符。
参数也可以是字符串或图形字符串数据类型。 字符串输入隐式转换为DECFLOAT(34)的数值,然后赋值给INTEGER。
- length
- 用于指定子字符串长度的表达式。 如果指定,则长度必须是一个返回内置大整数数据类型的值的表达式。
参数也可以是字符串或图形字符串数据类型。 字符串输入隐式转换为DECFLOAT(34)的数值,然后赋值给INTEGER。
该值必须大于或等于0且小于或等于 n ,其中 n 是string-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);
