3 値論理¶
Virtual DataPort は、SQL 標準で定義されている 3 値論理に完全に準拠しています。
3 値論理では、ブール式は以下の値のいずれかを返すことができると定義されています。
True
False
Unknown 、
NULL
値で表されます。
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」の行のいずれかで、 a
が NULL
で b
が 1
であるとします。この行の場合、 a
が NULL
であるため、 (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
に評価されないからです。