20

私は次の理由の背後で混乱していました。

SELECT * FROM table WHERE avalue is null

'avalue' が null の x 行を返します

SELECT * FROM table WHERE avalue <> true

'avalue' が null である行を返しません。

私の推論 (これは間違っているようです)nullは、一意の値 ( と等しくないnull) は、どちらにも等しくないため、結果セットに表示される必要があることを意味しtrueます。

column <> value列に値があることを暗示していると言って、null値を完全に無視していると主張できると思います。

これの背後にある理由は何ですか?これは他の一般的な SQL DB でも同じですか?

私の推論 (仮定) は、これは直観に反するものであり、その理由を知りたいと言っています。

4

3 に答える 3

34

それが正しいので、中途半端なRDBMSはすべて同じ方法でそれを行います。ここでPostgresのマニュアル
を引用しています:

いずれかの入力が null の場合、通常の比較演算子は、true または false ではなく、null (「不明」を意味する) を返します。たとえば、7 = NULLと同様に null が生成されます7 <> NULL。この動作が適切でない場合は、次の IS [ NOT ] DISTINCT FROM構文を使用してください。

expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression

これらの式は、単純なexpression <> expression比較よりも実行が少し遅いことに注意してください。

値にはboolean、より単純な もありIS NOT [TRUE | FALSE]ます。
2 番目のクエリで期待どおりの結果を得るには、次のように記述します。

SELECT * FROM table WHERE avalue IS NOT TRUE;

SQL フィドル。

于 2013-07-16T15:31:27.360 に答える