DISTINCT 述部

DISTINCT 述部は、値を別の値と比較するか、値のセットを別の値のセットと比較します。

構文図を読むビジュアルシンタックスダイアグラムをスキップするISNOTDISTINCT FROMrow-value-expressionISNOTDISTINCT FROMrow-value-expression

expression および row-value-expression は、配列式にすることはできません。

DISTINCT 演算子の後に指定した row-value-expression から戻されるエレメントの数は、DISTINCT 演算子の前に指定した row-value-expression から戻されるエレメントの数と一致している必要があります。 row-value-expressions の対応する列または式のデータ・タイプは、互換であることが必要です。 述部が評価されるときは、左側にあるそれぞれの式の値が、右側にある対応する式の値と比較されます。 述部の結果は、述部の形式によって異なります。

述語が IS DISTINCT、対応する値表現のペアの比較の少なくとも1つが false と評価された場合、述語の結果は true となります。 これ以外の場合、述部の結果は偽です。 結果が「不明」になることはありません。

述語が評価されると、 IS NOT DISTINCT FROM、対応する値式のすべてのペアが真と評価された場合、述語の結果は真となります(null値はnull値と等しいとみなされます)。 それ以外の場合、述部は偽です。 結果が「不明」になることはありません。

DISTINCT 述部は、次のコンテキストでは使用できません。

  • その ON フル・アウター・ジョインの結合条件
  • チェック制約
  • 比較述部
以下の DISTINCT 述部は、対応する検索条件と論理的に等価です。
表 1. DISTINCT 述部と論理的に等価の検索条件
DISTINCT 述部 検索条件
   value 1 IS NOT DISTINCT FROM value2
(value1 IS NOT NULL 
 AND value2 IS NOT NULL 
 AND value1 = value 2)
OR
(value1 IS NULL 
 AND value2 IS NULL)
value 1 IS DISTINCT FROM value2
NOT (value1 IS NOT DISTINCT FROM value2)
例 1: T1 は、3 つの行がある単一列の表であるとします。 列 C1 の値は、1、2、および NULL です。 次のような照会を行ったとします。
  SELECT * FROM T1
     WHERE C1 IS DISTINCT FROM :HV; 
次の表に、C1 とホスト変数のさまざまな値に対する述部の値を示します。
C1 の値 HV の値 述部の結果
1 2 はい
2 2 いいえ
ヌル 2 はい
1 ヌル はい
2 ヌル はい
ヌル ヌル いいえ
例 2: 最初の例と同じ表を想定しますが、この例では照会の述部の否定形式を考えてみましょう。
  SELECT * FROM T1
     WHERE C1 IS NOT DISTINCT FROM :HV; 
次の表に、C1 とホスト変数のさまざまな値に対する述部の値を示します。
C1 の値 HV の値 述部の結果
1 2 いいえ
2 2 はい
ヌル 2 いいえ
1 ヌル いいえ
2 ヌル いいえ
ヌル ヌル はい