3 値論理

Virtual DataPort は、SQL 標準で定義されている 3 値論理に完全に準拠しています。

3 値論理では、ブール式は以下の値のいずれかを返すことができると定義されています。

  1. True

  2. False

  3. UnknownNULL 値で表されます。

NULL 値を扱うときは、以下のルールを考慮してください。

  • NULL 値との比較は、 unknown を返す。

  • unknown 値との比較は unknown を返す。つまり、 unknown を返す関数に適用された関数は、これもまた unknown を返します。

  • 条件が unknown の場合は常に false を返す。つまり、クエリに WHERE 句と HAVING 句の両方または一方がある場合、条件が true を返す行のみが結果に追加されます。

  • 値が NULL であるかどうかを評価するには、それぞれ演算子 is null または is not null を使用します。 = null または <> null は決して true を返さないため、使用しないでください。

例 1

以下のクエリを実行するとします。

SELECT *
FROM view_1
WHERE NOT (a = b)

「view_1」の行のいずれかで、 aNULLb1 であるとします。この行の場合、 aNULL であるため、 (a = b) の結果は unknown になります。NOT (unknown) を評価した結果も unknown です。そのため、この行はクエリの結果に追加されません。

例 2

SELECT *
FROM employee INNER JOIN department
ON employee.dept_id = department.id

NULL との比較は unknown を返すため、このクエリは、「dept_id」列が NULL の従業員を返しません。

例 3

状態が登録されていないすべての顧客を取得するためのクエリ。

SELECT *
FROM customer
WHERE state is null

演算子 is null を使用するよう留意してください。

例 4

状態が登録されているすべての顧客を取得するためのクエリ。

SELECT *
FROM customer
WHERE state is not null

演算子 is not null を使用するよう留意してください。

例 5

予期したものが返されないクエリの例。

SELECT *
FROM customer
WHERE state <> null

このクエリは常に行を返しません。理由は、「NULL」値との比較は決して true に評価されないからです。