INSERT 标量函数 (scalar function)

INSERT 函数返回一个字符串,其中从源字符串start 开始, 长度个字符已被删除并且插入了插入字符串

阅读语法图跳过可视化语法图INSERT(源字符串, start,长度,插入字符串 ,CODEUNITS16CODEUNITS32OCTETS )

该模式是 SYSIBM。

INSERT函数返回一个字符串,其中从源字符串中删除了从start开始的 字符 ,并将 插入字符串 从start开始插入到源字符串中

source-string
用于指定源字符串的表达式。 表达式必须返回一个值,该值是内置字符串、图形字符串或二进制字符串数据类型,且不是LOB。 字符串的实际长度必须大于或等于1且小于或等于32704字节。

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

start
这是一个表达式,它返回一个 INTEGER。 整数指定了源字符串中删除字节和插入另一个字符串的起点。 整数值必须在1到源字符串长度加1的范围内。 如果指定了 OCTETS,且结果为图形数据,则该值必须是介于 1 和源字符串长度加 1 之间的奇数。

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

length
一个表达式,用于指定从start开始替换源字符串中字符串的长度。 length 必须是一个返回内置 INTEGER 数据类型值的表达式。 长度以指定的字符串单位表示,且值必须在0到源字符串长度的范围内。 如果指定了 OCTETS,且结果为图形数据,则长度必须为偶数且介于源字符串长度的 0 到两倍之间。 不指定长度等同于指定值为1,除非指定了OCTETS,且结果为图形数据,在这种情况下,不指定长度等同于指定值为2。

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

插入字符串
一个表达式,用于指定从start位置开始插入到源字符串中的字符串。 表达式必须返回一个值,该值是内置字符串、图形字符串或二进制字符串数据类型,且不是LOB。

source-stringinsert-string 必须具有兼容的数据类型。

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

CODEUNITS16、 CODEUNITS32 OCTETS
指定用于表示开始长度的单位。 如果源字符串是一个定义为位数据的字符串,则不能指定 CODEUNITS16 和 CODEUNITS32。 如果源字符串是图形字符串,则无法指定“八位字节”。 如果源字符串是二进制字符串,则无法指定 CODEUNITS16、 CODEUNITS32 和OCTETS。

如果未明确指定字符串单位,则结果的数据类型将决定所使用的单位:

  • 如果结果是一个图形字符串,则一个字符串单元为两个字节。 对于ASCII和EBCDIC数据,这相当于一个双字节字符。 对于Unicode,这对应于一个 UTF-16 代码点。
  • 否则,字符串单元就是一个字节。
CODEUNITS16
规定以16位 UTF-16 代码单位表示开始长度
CODEUNITS32
规定以32位 UTF-32 代码单元表示开始长度
OCTETS
指定以字节为单位表示开始长度

有关 CODEUNITS16、 CODEUNITS32 和OCTETS的更多信息,请参阅字符串单元规格

如果 source-stringinsert-string 具有不同的 CCSID 集, 则 insert-string (要插入的字符串)将转换为 source-string (源字符串)的 CCSID。

结果的编码方案与源字符串相同。 函数结果的数据类型取决于源字符串插入字符串的数据类型:

  • 如果源字符串是字符串,则为VARCHAR。 结果的CCSID取决于参数:
    • 如果源字符串插入字符串是字符位数据,则结果为位数据。
    • 如果源字符串是SBCS Unicode数据,而插入字符串不是SBCS Unicode数据,则结果的CCSID是Unicode数据的混合CCSID。
    • 如果源字符串插入字符串都是SBCS Unicode数据,则结果的CCSID就是SBCS Unicode数据的CCSID。
    • 否则,结果的CCSID是源字符串CCSID 对应的混合CCSID。 但是,如果输入是EBCDIC或ASCII,且没有相应的混合系统CCSID,则结果的CCSID是源字符串的 CCSID。
  • 如果源字符串是图形,则显示为图形。 结果的CCSID与源字符串的CCSID相同。
  • VARBINARY 如果源字符串插入字符串都是二进制字符串。

结果的长度取决于参数:

  • 如果开始长度是常数,则结果的长度属性为:
     L1 - MIN((L1 - V2 + 1), V3) + L4
    其中:
    • L1源字符串的长度属性
    • V2 是起始值
    • V3长度的
    • L4插入字符串的长度属性
  • 否则,结果的长度属性为源字符串的长度属性加上插入字符串的长度属性。 在这种情况下, 源字符串的长度属性加上插入字符串的长度属性,对于VARCHAR结果不得超过32704,对于VARGRAPHIC结果不得超过16352。

如果指定了 CODEUNITS16 或 CODEUNITS32 ,则插入操作将在Unicode版本的数据上执行。 如果需要,数据会转换为中间形式,以便评估函数。 如果使用中间形式,结果的实际长度取决于原始数据 (源字符串插入字符串 )以及该数据在Unicode中的表示形式。 请参阅确定最终结果的长度属性 ,了解如何计算结果字符串的长度属性。

如果未指定 CODEUNITS16 或 CODEUNITS32 ,则结果的实际长度为:
A1 - MIN((A1 - V2 + 1), V3) + A4
其中:
  • A1源字符串的实际长度
  • V2 是起始值
  • V3长度的
  • A4插入字符串的实际长度

如果结果字符串的实际长度超过了返回数据类型的最大值,则会发生错误。

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

示例1: 以下示例展示了如何将字符串“INSERTING”更改为其他字符串。 使用CHAR函数可将结果字符串的长度限制为10个字节。
   SELECT CHAR(INSERT('INSERTING',4,2,'IS'),10),
          CHAR(INSERT('INSERTING',4,0,'IS'),10),
          CHAR(INSERT('INSERTING',4,2,''),10)
     FROM SYSIBM.SYSDUMMY1;
这个例子返回“INSISTING”、“INSISERTIN”和“INSTING”
示例2: 前面的示例演示了如何将文本插入到某些文本的中间。 这个例子展示了如何以1为起点 (start )在部分文本之前插入文本。
   SELECT CHAR(INSERT('INSERTING',1,0,'XX'),10),
          CHAR(INSERT('INSERTING',1,1,'XX'),10),
          CHAR(INSERT('INSERTING',1,2,'XX'),10),
          CHAR(INSERT('INSERTING',1,3,'XX'),10)
     FROM SYSIBM.SYSDUMMY1;
这个例子返回“XXINSERTIN”、“XXNSERTING”、“XXSERTING”和“XXERTING”
示例3: 以下示例演示了如何在某些文本后插入文本。 在字符串“ABCABC”的末尾添加“XX”。 因为源字符串有6个字符,所以将起始位置设置为7(1加上源字符串的长度)。
   SELECT CHAR(INSERT('ABCABC',7,0,'XX'),10)
     FROM SYSIBM.SYSDUMMY1;
这个例子返回“ABCABCXX”。
示例 4: 以下示例说明如何将字符串“Hegelstraße”更改为“Hegelstrasse”。
   SELECT VARCHAR(INSERT('Hegelstraße',10,1,'ss'),15)
     FROM SYSIBM.SYSDUMMY1;
这个例子返回“Hegelstrasse”。