MySQL:列がnullである行の選択


270

特定の列にNULLがある行を選択しようとすると、空のセットが返されるという問題があります。しかし、phpMyAdminのテーブルを見ると、ほとんどの行でnullと表示されています。

私のクエリは次のようになります:

SELECT pid FROM planets WHERE userid = NULL

毎回空のセット。

実際の値の代わりに「NULL」または「null」として格納されないようにするために多くの場所が述べられており、スペース(userid = ' ')だけを探してみようと述べましたが、どれも機能していません。MyISAMはnullの格納に問題があるため、MyISAMを使用せずにinnoDBを使用するよう提案されました。テーブルをinnoDBに切り替えましたが、変換方法が原因で実際​​にはnullではないことが問題であるように思われます。テーブルをinnoDBなどとして再作成せずにこれを実行したいのですが、必要な場合は確実に試すことができます。


1
MyISAMはnullの格納に問題はありません。NULL自体のセマンティクスは、エンジンから独立している必要があります。
MarkR 2010

回答:


513

SQLのNULLは特別でありWHERE field IS NULL、NULLは何にも等しくないため、実行する必要があります。

自身を含める(つまり、NULL = NULLは常にfalse)。

https://en.wikipedia.org/wiki/Codd%27s_12_rulesを参照してRule 3 ください


25
不明です-間違いではありません。SQLは3つの値のロジックを使用します。
マーティン・スミス

39
NULL = NULLは実際にはFALSEではなく、再びNULLです。しかし、それもTRUEではないため、IF(NULL = NULL)は実行されません。
Konerak 2011年

1
@obeの回答も参照してください:SELECT 1 <=> 1、NULL <=> NULL、1 <=> NULL; ->
トーマス

nullは何にも等しくないだけでなく、等しくもありません。言い換えれば、select * from foo where bar <> "abc"なりませんバーがnullの場合に行を返します。今日はループに飛び込んだ。ドキュメントで<>は「等しくない」演算子を呼び出していますが、実際には「等しい」演算子です。
StackOverthrow 2018年


39

すべての回答が得られたので、もう少し追加したいと思います。私も同じ問題に直面していました。

クエリが失敗したのはなぜですか?あなたが持っている、

SELECT pid FROM planets WHERE userid = NULL;

mysql docから

SQLでは、NULLであっても、他の値と比較して真になることはありません。NULLを含む式は、式に関係する演算子と関数のドキュメントで特に指示がない限り、常にNULL値を生成します。

鉱山を強調します。

である列の値を検索NULLするには、expr = NULLテストを使用できません。次のステートメントは、どの式にも当てはまらないため、行を返しません。expr = NULL

解決

SELECT pid FROM planets WHERE userid IS NULL; 

をテストするNULLには、IS NULLおよびIS NOT NULL演算子を使用します。



11

http://w3schools.com/sql/sql_null_values.aspからの情報:

1)NULL値は不明なデータの欠落を表します。

2)デフォルトでは、テーブルカラムはNULL値を保持できます。

3)NULL値は他の値とは異なる方法で処理されます

4)NULLと0を比較することはできません。それらは同等ではありません。

5)=、<、<>などの比較演算子を使用してNULL値をテストすることはできません。

6)IS NULLおよびIS NOT NULL演算子を代わりに使用する必要があります

だからあなたの問題の場合:

SELECT pid FROM planets WHERE userid IS NULL

7

クエリと同じ問題がありました:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

値は返されませんでした。MyISAMの問題であると思われ、InnoDBのデータに対する同じクエリは期待される結果を返しました。

一緒に行きました:

SELECT * FROM 'column' WHERE 'column' = ' '; 

予想されるすべての結果が返されました。



0

データベースをAccessからMySQLに変換するときにも同じ問題が発生しました(vb.netを使用してデータベースと通信します)。

フィールド(フィールドタイプvarchar(1))がnullかどうかを評価する必要がありました。

このステートメントは私のシナリオでうまくいきました:

SELECT * FROM [table name] WHERE [field name] = ''

1
それがうまくいったなら、varchar(1)のデフォルトはnullではなく ''なので、この質問とは無関係です。
さりげない告白
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.