ストリングの比較

ストリング比較には 2 つのタイプがあります。

2 進ストリングの比較

2 進ストリングの比較では、照合順序は常に *HEX を使用し、各ストリングの対応するバイトが比較されます。 さらに、2 つの 2 進ストリングの長さが同一の場合にのみ、 その 2 つの 2 進ストリングは等しいと言えます。 長いストリングと短いストリングがあって、 短いほうのストリングの長さまで両方のストリングが等しい場合は、 たとえ長いほうのストリングの残りのバイトが 16 進ゼロであっても、 短いほうのストリングが長いほうのストリングよりも小さいと見なされます。 また、2 進ストリングと文字ストリングの比較は、 文字ストリングを 2 進ストリングにキャストしない限りできません。

文字ストリングとグラフィック・ストリングの比較

文字ストリングと Unicode グラフィック・ストリングの比較では、 すべての SBCS データと混合データの単一バイト部分について ステートメントが実行される時点で有効な照合順序が使用されます。照合順序が *HEX の場合、各ストリングの対応するバイトが比較されます。その他の照合順序ではすべて、各ストリングの対応するバイトの重み付けされた値が比較されます。

ストリングの長さが異なる場合は、短い方のストリングの右側にブランクを埋め込んだ一時的コピーを使用して比較します。 この埋め込みを行うのは、両方のストリングの長さを等しくするためです。埋め込み文字は、照合順序に関係なく、常にブランクです。ビット・データの場合も、ブランクを使用します。DBCS グラフィック・データの場合は、埋め込み文字は DBCS のブランク (x'4040') になります。Unicode グラフィック・データの場合、埋め込み文字は UTF-16 のブランクになります。1

2 つのストリングが等しくなるのは、次のいずれかに該当する場合です。

  • 両方のストリングが空である。
  • *HEX の照合順序を使用した場合、対応するバイトがすべて等しい。
  • *HEX 以外の照合順序を使用した場合、対応するバイトの重み付けの値がすべて等しい。

空のストリングは、ブランクのストリングと同じです。等しくない 2 つのストリング間の関係は、それらのストリングの左端から調べて、最初に見つかった等しくないバイトの対の比較によって決定されます。この比較は、そのステートメントが実行される時点で有効な照合順序に従って行われます。

複数の環境でアプリケーションを実行する場合は、 それぞれの環境で同じ結果を得るために同じ照合順序を使用する必要があります (照合順序は、それぞれの環境の CCSID に依存します)。 EBCDIC、ASCII、DB2® LUW について、米国英語の場合のデフォルトの照合順序の違いを以下の表にまとめます (以下の表は、それぞれの照合順序に基づいてソートしたリストになっています)。

表 1. 照合順序の違い
ASCII と Unicode EBCDIC DB2 LUW のデフォルト
0000 @@@@ 0000
9999 co-op 9999
@@@@ coop @@@@
COOP piano forte co-op
PIANO-FORTE piano-forte COOP
co-op COOP coop
coop PIANO-FORTE piano forte
piano forte 0000 PIANO-FORTE
piano-forte 9999 piano-forte

異なる長さを持つ 2 つの可変長ストリングが末尾ブランクの数だけが異なる場合には、等しくなります。 そのような値の集合から 1 つの値を選択する演算では、選択される値は不定のものになります。 このような不定な選択を伴う演算には、DISTINCT、MAX、MIN、UNION、 EXCEPT、INTERSECT、およびグループ化列の参照があります。グループ化列の参照に伴う不定な選択については、GROUP-BY 文節を参照してください。

比較の際の変換規則:

2 つのストリングを比較する場合、必要があれば、最初に一方のストリングがもう一方のストリングのコード化文字セットに変換されます。文字変換が必要になるのは、以下の条件にすべて該当する場合だけです。

  • 2 つのストリングの CCSID が異なっている。
  • どちらの CCSID も 65535 ではない。
  • 変換する側として選択されたストリングが、NULL でも空でもない。
  • 2 つの CCSID 間の変換が必要。詳しくは、コード化文字セットと CCSIDを参照してください。

コード化体系が異なる 2 つのストリングを比較する場合、以下のように、必要な変換がストリングに適用されます。

表 2. 文字変換のための結果エンコード化体系の選択
第 1 オペランド 第 2 オペランド
SBCS データ DBCS データ 混合データ Unicode グラフィック・データ
SBCS データ 下記参照 第 2 第 2 第 2
DBCS データ 第 1 下記参照 第 2 第 2
混合データ 第 1 第 1 下記参照 第 2
Unicode グラフィック・データ 第 1 第 1 第 1 下記参照

それ以外の場合は、それぞれのオペランドのタイプに応じて、変換用に選択されるオペランドが決まります。以下の表は、オペランドのタイプに応じて、どちらのオペランドが変換されるオペランドとして選択されるかを示しています。

表 3. 文字変換するオペランドの選択
第 1 オペランド 第 2 オペランド
列値 演算による値 特殊レジスター 定数 変数
列値 第 2 第 2 第 2 第 2 第 2
演算による値 第 1 第 2 第 2 第 2 第 2
特殊レジスター 第 1 第 1 第 2 第 2 第 2
定数 第 1 第 1 第 1 第 2 第 2
変数 第 1 第 1 第 1 第 1 第 2

外部コード化体系のデータを含む変数は、何らかの演算で使用される前に、必ず固有のコード化体系へ有効に変換されます。 上記の規則は、このような変換が既に行われていることを前提にしています。

ストリングの文字が変換できない場合や、CCSID 間の変換が定義されていない場合は、エラーが戻されます。詳しくは、コード化文字セットと CCSIDを参照してください。 ストリングの文字が置換文字に変換された場合は、警告が出されます。

1 UTF-16 では、コード・ポイント X'0020' および X'3000' でブランク文字を定義しています。 データベース・マネージャーは、コード・ポイント X'0020' の位置にある ブランクを埋め込みに使用します。