SQL 解説書

ストリングの比較

文字ストリングは、データベースの作成時に指定された照合順序に従って比較されます。 ただし、FOR BIT DATA 属性の文字ストリングは例外で、 そのような文字ストリングは常にビット値に従って比較されます。

長さの異なる文字ストリングを比較する場合、短い方のストリングの右端に、 長い方のストリングの長さになるまで 1 バイト・ブランクを埋め込んだものの論理コピーが比較に使用されます。 この論理的な拡張は、FOR BIT DATA のものも含め、すべての文字ストリングに対して行われます。

文字ストリング (FOR BIT DATA のタグが付けられた文字ストリングを除く) は、 データベースの作成時に指定された照合順序にしたがって比較されます (データベースの作成時に指定される照合順序の詳細については、 管理の手引き を参照してください)。 たとえば、データベース・マネージャーによって指定されるデフォルトの照合順序は、 同じ文字の小文字と大文字に同じ重みを与えています。

データベース・マネージャーは、 完全に同一のストリングだけが相互に等しいものとして扱われるようにするために、 2 パス比較を実行します。 第 1 のパスでは、ストリングがデータベースの照合順序に従って比較されます。 ストリングの文字の重みが等しい場合、2 番目の "同点決勝戦" パスを実行して、 実際のコード・ポイント値に基づいてストリングを比較します。

2 つのストリングは、両方が空であるか、 または対応するすべてのバイト数が等しい場合には、等しくなります。

どちらかのオペランドがヌル値の場合の結果は不定です。

基本比較演算子 (=、<>、<、>、<=、および >=) を使用する比較演算では、 長ストリングおよび LOB ストリングはサポートされません。 このようなストリングの比較は、 LIKE 述部と POSSTR 関数を使用した比較でサポートされています。 詳細については、LIKE 述部POSSTRを参照してください。

長ストリングおよび LOB ストリングのうち 4 000 バイト以下の部分は、 SUBSTR と VARCHAR のスカラー関数を使用して比較できます。 たとえば、以下のような列を考えてみます。

   MY_SHORT_CLOB   CLOB(300)
   MY_LONG_VAR     LONG VARCHAR

この場合、次の演算は有効です。

   WHERE VARCHAR(MY_SHORT_CLOB) > VARCHAR(SUBSTR(MY_LONG_VAR,1,300))

例:

以下の例で、'A'、'A'、'a'、および 'a' のコード・ポイント値はそれぞれ、 X'41'、X'C1'、X'61'、および X'E1' です。

'A'、'A'、'a'、'a' という文字の重みが 136、139、135、138 である照合順序を考えてみます。 このような場合は以下のようになります。

'a' < 'A' < 'a' < 'A'

今度は D1、D2、D3、および D4 という 4 つの DBCS 文字を例にとって考えてみましょう。 これらの文字はそれぞれ 0xC141、0xC161、0xE141、 および 0xE161 というコード・ポイントを持っています。 これらの DBCS 文字が CHAR 列に含まれている場合、 各文字のバイトが持っている照合重みに従った順序でソートされます。 最初の 2 つのバイトの重みは 138 と 139 であるため、 D3 と D4 は D2 と D1 よりも前に来ます。 続く 2 つのバイトの重みは 135 と 136 であるため、 順序は以下のようになります。

D4 < D3 < D2 < D1

ただし、比較する値に FOR BIT DATA 属性がある場合や、 これらの DBCS 文字が GRAPHIC 列に格納された場合は、照合順序は無視され、 これらの文字が持っているコード・ポイントに従って文字が比較されます。 以下のようになります。

'A' < 'a' < 'A' < 'a'

DBCS 文字はコード・ポイントの順序でソートされます。以下のようになります。

D1 < D2 < D3 < D4

次に 'A'、'A'、'a'、'a' という文字が、 74、75、74、および 75 の (固有でない) 重みを持つ照合順序を考えてみましょう。 照合重みだけに注目すると (第 1 のパス)、 'a' は 'A' に等しく、'a' は 'A' に等しいですが、 決着を付けるために文字のコード・ポイントを使用すると (第 2 のパス)、 以下のようになります。

'A' < 'a' < 'A' < 'a'

CHAR 列に含まれている DBCS 文字は、 最初は重みに従ったバイトの順序 (第 1 パス) でソートされます。 それでも決着がつかない場合は、 コード・ポイントに従ったバイトの順序 (第 2 パス) でソートされます。 最初の 2 つのバイトは重みが同じであるため、 コード・ポイント (0xC1 と 0xE1) で決着を付けることになります。 結果として、文字 D1 と D2 は文字 D3 と D4 の前にソートされます。 続く 2 つのバイトもこれと同じように比較されます。 最終的な結果は以下のようになります。

D1 < D2 < D3 < D4

ここでも、比較する値に FOR BIT DATA 属性がある場合や、 これらの DBCS 文字が GRAPHIC 列に格納された場合は、照合順序は無視され、 これらの文字が持っているコード・ポイントに従って文字が比較されます。 以下のようになります。

D1 < D2 < D3 < D4

この例では、照合重みが使用されたときと同じ結果が戻されていますが、 実際の場面でいつもそのようになるとは限りません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]