式における結合演算子

2 つのストリング・オペランドを連結すると、式の結果はストリングとなります。

連結のオペランドは、互換性のあるストリングでなければなりません。 バイナリ文字列は文字列と結合できません。FOR BIT DATAとして定義された文字列も含みます(データ型の互換性に関する詳細は、 表1の互換性マトリクスを参照してください)。 ストリング・タイプに基づく特殊タイプは、適切なユーザー定義関数が作成されている場合のみ連結することができます。

CONCAT と縦線 (||) は両方とも、連結演算子を表します。 縦棒(または、一部の国では縦棒の代わりに使用しなければならない文字 1 )は、ある DBMS から別の DBMS に渡されるステートメントの解析エラーの原因となることがあります。 この問題は、ソースとターゲットのCCSIDの特定の組み合わせで文字変換が行われる場合に発生します。 このような理由から、連結演算子としては CONCAT の方が望ましいと言えます。

いずれかのオペランドが NULL 値になる可能性がある場合は、 結果も NULL 値になる可能性があり、いずれかが NULL 値なら結果は NULL 値になります。 そうでない場合、結果は第 1 オペランド・ストリングの後に第 2 オペランド・ストリングが続いた形式となります。

以下の表は、ストリング・オペランドが、結果のデータ・タイプ と長さ属性をどのように決定するかを示しています (オペランドを連結する順序は、結果に 影響を与えません)。
表 1. 連結するオペランドのデータ・タイプと長さ

オペランド列が1つある場合、
そして、もう一方の
オペランドは
結果列のデータ・タイプ1
CHAR( x ) CHAR(y) (256 より小さい結合された長さ属性付き) CHAR( x + y ) 2 倍
CHAR(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 )
GRAPHIC(y ) DBCLOB(MIN( x + y,1G))
VARGRAPHIC( y )
DBCL OB (y)
GRAPHIC(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 )
GRAPHIC(y )
GRAPHIC(y )
DBCL OB (x) CHAR( y ) DBCLOB(MIN( x + y,1G))
VARCHAR( y )
CLOB(y )
GRAPHIC(y )
VARGRAPHIC( y )
DBCL OB (y)
BINARY( x ) BINARY(y) (256 より小さい結合された長さ属性付き) バイナリ( x + y )
BINARY(y) (255 より大きい結合された長さ属性付き) VARBINARY(MIN( x + y, 32764 ))
VAR B INARY(x) VARB IN ARY(y) VARBINARY(MIN( x + y, 32764 ))
BINARY( y )
BLOB( x ) BLOB( y ) BLOB(MIN( x + y, 2G ))
注:
    • 2G は 2,147,483,647 バイトを表します。
    • 1G は 1,073,741,823 2 バイト文字を表します。
  1. CHAR(x) も CHAR(y) も MIXED データを含むことはできません。 いずれかのオペランドに混合データが含まれている場合、結果は VARCHAR(MIN( x '+ y ', 32764 )) になります。
  2. 第 1 オペランドの変換が必要な場合、x' = 3x になります。それ以外の場合、x のままです。 第 2 オペランドの変換が必要な場合、y'= 3y になります。それ以外の場合、y のままです。
  3. 必要な場合 (つまり、オペランドがまだ UTF-16 でない場合)、両方のオペランドが UTF-16 に変換され、結果は連結されます。

前の表が示しているように、結果の長さは、オペランドの長さの合計になります。 ただし、重複シフト・コード文字が結果から除去される場合には、 結果の長さは 2 バイト少なくなります。 冗長シフト・コード文字は、両方の文字ストリングが EBCDIC 混合データであり、最初のストリングが shift-in 文字 (X'0F') で終わり、2 番目のオペランドが shift-out 文字 (X'0E') で始まる場合に存在します。 これらの 2 つのシフト・コード文字は結果から除去されます。

結果の CCSID は、 セット演算および連結における文字変換のルールによって決定されます。 これらの規則が適用されると、オペランドに応じて次のような結果となります。

  • どちらかのオペランドが BIT データの場合、結果は BIT データとなります。
  • SBCS データを混合データと比較する際に行われる変換は 、コード化スキームにより異なります。 コード化スキームが Unicode の場合は、SBCS オペランドは MIXED に変換されます。 それ以外の場合、変換は比較を行う Db2 用のインストールパネルDSNTIPFのMIXED DATAフィールドに依存します
    • サーバーの MIXED DATA オプションが YES の場合は、混合データ。 結果は、必ずしも正しい形式の混合データではありません。
    • SBCS データ (サーバー側の MIXED DATA オプションが NO の場合)。 混合データを純粋な SBCS データに変換できない場合は、エラーが発生します。

オペランドがフィールド・プロシージャーを持つ列に入って いるストリングの場合、演算はデコードされた形式の値に適用されます。 結果は、フィールド・プロシージャーを継承しません。

連結の 1 つのオペランドは、パラメーター・マーカーにすることができます。 1 つのオペランドがパラメーター・マーカーである場合、そのデータ・タイプと 長さ属性は、ストリング・データ・タイプを除き、パラメーター・マーカーではないオペランドと同じと見なされます。 CONCAT 演算子で他のオペランドが文字列データ型である場合の、型なしパラメータマーカーのデータ型長を計算する際に使用される式については、表1 を参照してください。 ネストした連結の場合の属性を決定するには、連結演算の順序を考慮する必要があります。

特殊タイプが文字データ・タイプに基づいている場合でも、連結のオペランドは 特殊タイプであってはなりません。 特殊タイプを連結するには、CONCAT 演算子を ソースとするユーザー定義関数を作成してください。 例えば、特殊タイプ TITLE と TITLE_DESCRIPTION の両方がデータ・タイプ VARCHAR(25) に基づいている場合、ATTACH という名前の以下のユーザー定義関数を使用して、2 つの特殊タイプを連結することができます。
   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 サブシステム上でのみ連結を意味すると解釈されます。 X'BBBB' は、一部の EBCDIC コード・ページでは右大括弧文字 (']]') のペアであり、配列インデックス式で使用される場合は連結演算子として使用されません。 X'BBBB' の代わりに CONCAT を連結演算子として使用することを検討してください。これは、配列インデックス式で X'BBBB' が右大括弧と混同される可能性があるためです。