SQL 解説書

比較の際の変換規則

2 つのストリングを比較する場合、必要なら、 一方のストリングがまずもう一方のストリングのコード・ページに変換されます。 詳細については、ストリング変換に関する規則を参照してください。

結果の順序付け

結果の分類が必要な場合、 ストリングの比較で説明されているストリング比較規則に基づいて順序付けが行われます。

比較はデータベース・サーバー側で実行されます。 クライアント・アプリケーションに結果が戻される時点で、 コード・ページ変換が実行されることがあります。 後から行われるこのようなコード・ページ変換は、 サーバーの決定した結果セットの順序には影響しません。

ストリング比較に関する MBCS の考慮事項

SBCS/MBCS 混合文字ストリングは、 データベースの作成時に指定された照合順序に従って比較されます。 デフォルト (SYSTEM) 照合順序で作成されたデータベースの場合、 1 バイトの ASCII 文字はすべて正しい順序で保管されますが、 2 バイト文字は必ずしもコード・ポイントの順序になっているとは限りません。 IDENTITY 順序で作成されたデータベースの場合、 2 バイト文字はすべてコード・ポイントの順序で保管され、 1 バイトの ASCII 文字も同様にコード・ポイントの順序で保管されます。 COMPATIBILITY 順序で作成されたデータベースの場合、 ほとんどの 2 バイト文字について正しくソートを行い、 ASCII についてもほぼ正しい、中間的な順序が使用されます。 これは、DB2 バージョン 2 ではデフォルトの照合表でした。

混合文字ストリングはバイトごとに比較されます。 混合ストリングに含まれる多重バイト文字について通常と異なる結果になる場合がありますが、 これは個々のバイトが別個に扱われるためです。

例:

この例で、'A'、'B'、'a'、および 'b' の 2 バイト文字のコード・ポイント値はそれぞれ、 X'8260'、X'8261'、X'8281'、および X'8282' です。

コード・ポイント X'8260'、X'8261'、X'8281'、 および X'8282' の重みがそれぞれ 96、65、193、 および 194 である照合順序を考えてみます。 この場合は以下のようになります。

   'B' < 'A' < 'a' < 'b'

および

   'AB' < 'AA' < 'Aa' < 'Ab' < 'aB' < 'aA' < 'aa' < 'ab'

漢字ストリングの比較は、文字ストリングの場合と同じように処理されます。

漢字ストリングの比較は、 LONG VARGRAPHIC を除くすべての漢字ストリング・データ・タイプの間で有効です。 LONG VARGRAPHIC および DBCLOB データ・タイプは、 比較演算では使用できません。

漢字ストリングに対しては、データベースの照合順序は使用されません。 その代わりに、漢字ストリングは、 常に対応するバイトの数値 (2 進値) に基づいて比較されます。

前の例で、リテラルが漢字ストリングの場合、以下のような結果になります。

   'A' < 'B' < 'a' < 'b'

および

   'AA' < 'AB' < 'Aa' < 'Ab' < 'aA' < 'aB' < 'aa' < 'ab'

長さの異なる漢字ストリングを比較する場合、 短い方のストリングの右端に長い方のストリングの長さになるまで、 2 バイト・ブランクを埋め込んだものの論理コピーが比較に使用されます。

2 つの漢字ストリングの値が等しくなるのは、両方が空であるか、 または対応する漢字がすべて等しい場合です。 どちらかのオペランドがヌル値の場合の結果は不定です。 2 つの値が等しくない場合は、 両者の関係は単純な 2 進ストリング比較によって決定されます。

この節で説明してきたとおり、 バイトに基づくストリングの比較は誤った結果をもたらす場合があります。 つまり、文字比較で得られる文字とは異なる結果が生じる場合があります。 ここで示した一連の例は、同じ MBCS コード・ページであることを前提にしていますが、 実際には、同じ言語を使用していても異なる多重バイトのコード・ページを使用することがあるので、 状況はもっと複雑であるといえます。 たとえば、日本語 DBCS コード・ページと 日本語 EUC コード・ページからのストリングを比較するというような場合が考えられます。

日付 / 時刻の比較

DATE、TIME、または TIMESTAMP 値は、同じデータ・タイプの別の値か、 そのデータ・タイプのストリング表記と比較することができます。 すべての比較は日時順に行われます。 つまり、0001 年 1 月 1 日からの時間の経過の大きい方が値が大きいということです。

TIME 値と、時刻値のストリング表記とが関係する比較では、 常に秒数が含められます。 ストリング表記で秒数を省略しているときは、暗黙のうちにゼロ秒が補われます。

TIMESTAMP 値に関する比較は、等しいとみなしてもよいような表示の考慮はしません。 日時順に行われます。

例:

  TIMESTAMP('1990-02-23-00.00.00') > '1990-02-22-24.00.00'


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