0

Toppings の値が「Chocolate」である 5 つのレコードを含むテーブルでは、そのうちの 2 つは MaraschinoCherry 列に値が「Yes」であり、他の 3 つはその列に何も含まれていません (「No」ではない - 何もない/空白)。

このクエリは正常に機能します。

select definition from desserts 
where (Toppings = 'Chocolate') and 
      (MaraschinoCherry <> 'Yes') 
order by id

...予想される 3 つのレコードを返します。しかし、これは私が期待する 2 つのレコードではなく、何も返しません。

select definition from desserts 
where (Toppings = 'Chocolate') and 
      (MaraschinoCherry = 'Yes') 
order by id

???

4

1 に答える 1

3

あなたの質問への答えは簡単です。2 つの例外を除いて、NULL 値と比較すると、結果として NULL が生成されます。そう、

MaraschinoCherry = 'Yes'

MaraschinoCherry <> 'Yes'

MaraschinoCherry が NULL 値の場合、どちらもNULL を返します。NULL 比較は FALSE と同じように扱われます。

2 つの例外は、IS NULL と IS NOT NULL です。「= NULL」は常に NULL を返し、これは FALSE として解釈されることに注意してください。

これを修正する通常の方法は、COALESCE を使用することです。

COALESCE(MaraschinoCherry, 'NO') = 'Yes'

(関数 ISNULL() は一種の同等のものですが、COALESCE はより多くの引数を許可し、標準 SQL です。)

テーブルを定義するときに列のデフォルト値を指定する、NULL への明示的な比較を追加する、列を「NOT NULL」と宣言する、一部のデータベースではオーバーライドするなど、これを修正する方法は他にもあります。 SQL 標準に違反する比較での NULL の動作 (強くお勧めしません!)。

于 2012-07-05T17:53:29.867 に答える