web-dev-qa-db-ja.com

NULL値とMySQLの比較

MySQLテーブルにCODEという列がありますが、これはNULLになる可能性があります。選択結果セットで無視したいCODE = 'C'の行があるとします。結果セットにCODE = NULLまたはCODE!= 'C'を含めることができます。

次のクエリは、CODEがNULLの行を返しません。

SELECT * from TABLE where CODE!='C'

しかし、このクエリは期待どおりに機能し、正しい方法であることがわかっています。

SELECT * from TABLE where CODE IS NULL OR CODE!='C'

私の質問は、なぜCODE!= 'C'だけがCODE = NULLの行を返さないのですか?確かに 'C'はNULLではありません。ここでは、文字と値を比較していません。なぜそれがうまくいかないのか誰かが光を投げることはできますか?

32
dev_musings

MySQLでは、NULLは、値がないのではなく、「欠損した不明な値」と見なされます。ご覧ください このMySQLリファレンスon NULL

NULLとの算術比較はtrueまたはfalseを返しませんが、代わりにNULLを返します。したがって、NULL != 'C'は、trueを返すのではなく、NULLを返します。

「NULL」との算術比較はfalseを返します。 SQLでこれを確認するには:

SELECT IF(NULL=123,'true','false') 

NULL値を確認するには、IS NULLおよびIS NOT NULL演算子を使用する必要があります。

45
Sam DeHaan

私のテストとここにあるドキュメントに基づいて: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

<=>を使用して、nullを比較し、ブール結果を取得できます。
注:NOT EQ演算子のように見えますが、EQ演算子です

例えば:

select x <=> y; 
or
select @x <=> @y;

これは、文字列とnull、文字列と文字列なども比較します。

29
Alan Fullmer

SQLでは、NULL値は特別な値であり、他の値とは比較できません。 NULLとの直接比較の結果は常にNULLになりますが、(残念ながら)実装によってはFALSEが見つかる場合があります。

Null値をテストするには、IS NULLおよびIS NOT NULLを使用する必要があります。

14
cornuz
SELECT * 
FROM `table_name` 
WHERE IFNULL(`column_name` != 'C', TRUE)
6
Vasil Nikolov

application_id = '1223333344'で名前がnullのユーザーから*を選択します。

2
Vipin Pandey