SUBSTRING 标量函数

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

Read syntax diagramSkip visual syntax diagramSUBSTRING( expressionFROMstartFORlengthUSINGCODEUNITS16CODEUNITS32OCTETSexpression,start,length,CODEUNITS16CODEUNITS32OCTETS )

该模式是 SYSIBM。

expression
用于指定从中派生结果的字符串的表达式。 表达式必须返回内置字符串,数字值,布尔值或日期时间值。 如果该值不是字符串,那么在对函数求值之前,会将其隐式强制类型转换为 VARCHAR。

输入表达式的子串包含输入表达式的零个或更多个连续字符串单元。

start
一个表达式,用于指定要从中计算子串的位置 (相对于输入表达式的开头)。 例如:
  • 位置 1 是输入表达式的第一个字符串单位。 语句 SUBSTRING('abc',1,2) 返回 'ab'
  • 位置 2 是位置 1 右侧的第一个位置。 语句 SUBSTRING('abc',2,2) 返回 'bc'
  • 位置 0 是位置 1 左侧的第一个位置。 语句 SUBSTRING('abc',0,2) 返回 'a'
  • 位置 -1 是位置 1 左侧的第两个位置。 语句 SUBSTRING('abc',-1,2) 返回长度为零的字符串。
表达式必须返回内置数字, CHAR , VARCHAR , GRAPHIC 或 VARGRAPHIC 值。 如果该值不是 INTEGER 类型,那么在对该函数进行求值之前,会将其隐式强制转换为 INTEGER。

起始值可以是正数,负数或零。 如果指定了 OCTETS 并且输入表达式包含图形数据,那么开始值必须为奇数 (SQLSTATE 428GC)。

length
指定结果长度的表达式。 表达式必须返回内置数字, CHAR , VARCHAR , GRAPHIC 或 VARGRAPHIC 值。 如果该值不是 INTEGER 类型,那么在对该函数进行求值之前,会将其隐式强制转换为 INTEGER。
如果输入表达式为:
  • 固定长度字符串,缺省长度为 CHARACTER_LENGTH(expression USING string-unit) - start + 1。 这是从输入表达式的起始位置到最终位置的字符串单元数 (CODEUNITS16, CODEUNITS32或 OCTETS)。
  • 变长字符串,缺省长度为零或 CHARACTER_LENGTH(expression USING string-unit) - start + 1,以较大者为准。
如果指定的长度为零,那么结果为空字符串。

如果该值不是 INTEGER 类型,那么在对该函数进行求值之前,会将其隐式强制类型转换为 INTEGER。 该值必须大于或等于零。 如果指定了大于 n 的值,其中 n 是 ( expression的 length 属性)- start + 1 ,那么将使用 n 作为生成的子串的长度。 该值以显式指定的字符串单位表示。 如果指定了 OCTETS ,并且输入表达式包含图形数据,那么长度必须为偶数 (SQLSTATE 428GC)。

CODEUNITS16、CODEUNITS32 或 OCTETS
指定 startlength的字符串单元。 CODEUNITS16 指定 startlength 将以 16 位 UTF-16 代码单元表示。 CODEUNITS32 指定 startlength 将以 32 位 UTF-32 代码单元表示。 OCTETS 指定 startlength 将以字节表示。

如果将字符串单元指定为 CODEUNITS16 或 CODEUNITS32,并且 expression 是二进制字符串或 FOR BIT DATA 字符串,那么将返回错误 (SQLSTATE 428GC)。

如果未指定字符串单元参数,并且 expression 是不是 FOR BIT DATA 的字符串或图形字符串,那么缺省值为 CODEUNITS32。 否则,缺省值为 OCTETS。

有关 CODEUNITS16, CODEUNITS32和 OCTETS 的更多信息,请参阅 字符串中的 内置函数中的字符串单元

使用 OCTETS 调用 SUBSTRING 函数时,如果 source-string 编码为每个代码点 (混合或 MBCS) 需要多个字节的代码页,那么 SUBSTRING 操作可能会拆分多字节代码点,并且生成的子串可能以部分代码点开始或结束。 如果发生此情况,那么此函数会以不更改结果的字节长度的方式将前导或尾部部分代码点的字节替换为空白。 (请参阅 "示例" 部分中的相关示例。)

结果

结果的数据类型取决于第一个自变量的数据类型,如下表中所示。

表 1. SUBSTRING 结果的数据类型
第一个自变量的数据类型 结果的数据类型
CHAR 或 VARCHAR VARCHAR
CLOB CLOB
GRAPHIC 或 VARGRAPHIC VARGRAPHIC
DBCLOB DBCLOB
BINARY 或 VARBINARY VARBINARY
BLOB BLOB

结果的长度属性等于输入表达式的长度属性。 如果函数的任何自变量可以为空,那么结果可以为空; 如果任何自变量为空,那么结果为空值。 未使用任何字符填充结果。 如果输入表达式的实际长度为 0 ,那么结果的实际长度也为 0。

注意

  • 结果的长度属性等于输入表达式的长度属性。 此行为与 SUBSTR 函数的行为不同,其中 length 属性派生自函数的 startlength 自变量。

示例

  • 示例 1:FIRSTNAME 是表 T1中的 VARCHAR (12) 列。 其值之一是 6-character string 'Jürgen'。 当 FIRSTNAME 具有此值时:
    Function ...                          Returns ...
    ------------------------------------  ------------------------------------
    SUBSTRING(FIRSTNAME,1,2,CODEUNITS32)  'Jü' -- x'4AC3BC'
    SUBSTRING(FIRSTNAME,1,2,CODEUNITS16)  'Jü' -- x'4AC3BC'
    SUBSTRING(FIRSTNAME,1,2,OCTETS)       'J ' -- x'4A20' (a truncated string)
    SUBSTRING(FIRSTNAME,8,CODEUNITS16)    a zero-length string
    SUBSTRING(FIRSTNAME,8,4,OCTETS)       a zero-length string
    SUBSTRING(FIRSTNAME,0,2,CODEUNITS32)  'J' -- x'4AC3BC'
  • 示例 2: 以下示例说明当字符串长度单位为 OCTETS 时, SUBSTRING 如何将前导或尾部部分多字节代码点的字节替换为空白。 Assume that UTF8_VAR contains the UTF-8 representation of the Unicode string '&N~AB', where '&' is the musical symbol G clef and '~' is the combining tilde character.
       SUBSTRING(UTF8_VAR, 2, 5, OCTETS)
    "N" 之前有三个空白字节, "N" 之后有一个空白字节。