表达式中的连接运算符

当两个字符串操作数连接时,表达式的结果是一个字符串。

连接操作的运算数必须是兼容的字符串。 二进制字符串不能与字符串连接,包括定义为“位数据”的字符串(有关数据类型兼容性的更多信息,请参阅表1中的兼容性矩阵)。 只有在创建了适当的用户定义函数后,才能将基于字符串类型的独特类型连接起来。

CONCAT和竖线(||)都表示连接操作符。 竖线(或者在某些国家/地区必须用来代替竖线的字符 1 )可能会导致从一个 DBMS 传递到另一个 DBMS 的语句中出现解析错误。 如果语句在源CCSID和目标CCSID的某些组合下进行字符转换,就会出现这个问题 1。 因此,CONCAT是首选的连接运算符。

如果任一操作数可以为空,则结果可以为空;如果任一操作数为空,则结果为空值。 否则,结果由第一个操作数字符串和第二个操作数字符串组成。

下表显示了字符串操作数如何确定结果的数据类型和长度属性(操作数连接的顺序对结果没有影响)。
表 1. 数据类型和连接操作数的长度
如果一个
操作数列是
另一个
操作数是
结果列的数据类型为1
CHAR( x ) CHAR(y) 带有长度属性,且长度小于 256 字符( x + y2
字符串(y) 的合并长度属性大于255 VARCHAR(MIN( x '+ y ', 32764 )) 3
VARCHAR( y )
VAR CHAR(x) VARCHAR( y ) VARCHAR(MIN( x '+ y ', 32764 )) 3
CLOB(x ) CHAR (y ) CLOB(MIN( x '+ y ',2G))
VARCHAR( y )
CLOB(y )
图形 DBCLOB(MIN( x + y,1G))
VARGRAPHIC( y )
DBCL OB (y)
图形 (x CHAR (y ) VARGRAPHIC(MIN( x + y, 16382 )) 4
VARCHAR( y )
VARGRAPHIC( y )
VARGRAPHIC( x ) CHAR (y ) VARGRAPHIC(MIN( x + y, 16382 )) 4
VARCHAR( y )
图形
图形
DBCL OB (x) CHAR (y ) DBCLOB(MIN( x + y,1G))
VARCHAR( y )
CLOB(y )
图形
VARGRAPHIC( y )
DBCL OB (y)
二进制 (x 二进制 (y ),其组合长度属性小于256 二进制( x + y
二进制 (y ),其长度属性总和大于255 VARBINARY( MIN( x + y, 32764 ))
VAR B INARY(x) VARB IN ARY(y) VARBINARY( MIN( x + y, 32764 ))
二进制 (y
BLOB( x ) BLOB(y) BLOB(MIN( x + y, 2G ))
注:
    • 2G 代表2,147,483,647字节
    • 1G 代表1,073,741,823个双字节字符
  1. CHAR(x) 和CHAR(y) 都不能包含混合数据。 如果任一操作数包含混合数据,则结果为VARCHAR ( MIN(x'+y ',32764))
  2. 如果需要转换第一个操作数, 则x' = 3x;否则, 保持x不变。 如果需要转换第二个操作数, 则 y'= 3y; 否则,保持 y
  3. 如果需要,两个操作数都会转换为 UTF-16 (即操作数尚未转换为 UTF-16 ),并将结果连接起来。

如上表所示,结果的长度是操作数长度的总和。 然而,如果从结果中删除冗余的移位代码字符,结果的长度将减少两个字节。 当两个字符串都是EBCDIC混合数据时,且第一个字符串以移入字符( X'0F' ),且第二个操作数以移出字符X'0E' )。 结果中删除了这两个换码字符。

结果的 CCSID 由集合运算和连接运算中的字符转换规则确定。 这些规则带来的后果如下:

  • 如果任一操作数是位数据,则结果也是位数据。
  • 当SBCS数据与混合数据比较时,转换取决于编码方案。 如果编码方案是Unicode,则SBCS操作数将转换为MIXED。 否则,转换取决于安装面板DSNTIPF上的混合数据字段,用于进行比较的 Db2
    • 如果服务器上的混合数据选项为“是”,则数据为混合数据。 结果不一定是有条理的混合数据。
    • 如果服务器上的混合数据选项为否,则SBCS数据。 如果混合数据无法转换为纯SBCS数据,则会发生错误。

如果操作数是带有字段程序的列中的字符串,则操作将应用于该值的解码形式。 结果不继承字段过程。

连接操作数之一可以是参数标记。 当一个操作数是参数标记时,其数据类型和长度属性被视为与非参数标记的操作数相同,但字符串数据类型除外。 当另一个操作数是字符串数据类型时,用于计算CONCAT运算符中无类型参数标记的数据类型长度的公式请参考表1。 在嵌套级联的情况下,必须考虑级联操作的顺序,以确定这些属性。

即使不同类型是基于字符数据类型,但连接操作数不能是不同类型。 要连接一个不同的类型,请创建一个以CONCAT运算符为源的用户定义函数。 例如,如果TITLE和TITLE_DESCRIPTION这两种不同类型都基于数据类型VARCHAR(25),则可以使用名为ATTACH的以下用户定义函数来连接这两种不同类型:
   CREATE FUNCTION ATTACH (TITLE, TITLE_DESCRIPTION)
      RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
或者,可以通过使用用户定义的函数来添加不同类型,从而重载连接操作符:
   CREATE FUNCTION "||" (TITLE, TITLE_DESCRIPTION)
      RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
1 在各种EBCDIC代码页中, Db2 支持代码点组合 X'4F4F' 、X'BBBB'X'5A5A' 表示连接。 X'BBBB'和 X'5A5A' 仅在单字节字符集 Db2 子系统中被解释为串联。 在某些EBCDIC代码页中,X'BBBB'是一对右括号字符(']]'),在数组索引表达式中不用于连接操作。 请考虑使用CONCAT作为连接运算符,而不是X'BBBB',因为X'BBBB'可能会与数组索引表达式中的右括号混淆。