web-dev-qa-db-ja.com

MySQL:列がnullの行を選択する

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

私の質問はこんな感じです。

SELECT pid FROM planets WHERE userid = NULL

毎回空のセット。

実際の値の代わりに "NULL"や "null"として格納されていないことを確認するために多くの場所で言われていて、スペース(userid = ' ')だけを探してみると言われました。 MyISAMにはnullの格納に問題があるため、MyISAMを使用せずにinnoDBを使用するという提案がありました。テーブルをinnoDBに切り替えたのですが、変換する方法が原因で、実際にはまだnullではないという問題があるかもしれません。私は、テーブルをinnoDBまたは他の何かとして再作成する必要なしにこれをしたいのですが、もしそうしなければ、私は確かにそれを試すことができます。

234
The.Anti.9

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

自分自身も含めます(つまり、NULL = NULLは常に偽です)。

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

468
Marc B
SELECT pid FROM planets WHERE userid IS NULL
58

すべてが答えを与えられているので、私はもう少し加えたいと思います。私も同じ問題に直面していました。

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

SELECT pid FROM planets WHERE userid = NULL;

Mysqlドキュメントから

SQLでは、NULL値は他のどの値、たとえNULLと比較しても真になることはありません。表現に関与しています。

私のことを強調します。

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

溶液

SELECT pid FROM planets WHERE userid IS NULL; 

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

36
Aniket Kulkarni

<=>演算子もあります。

SELECT pid FROM planets WHERE userid <=> NULL

うまくいくでしょう。いいことに、<=>はNULL以外の値でも使用できます。

SELECT NULL <=> NULL1を生成します。

SELECT 42 <=> 421も生成します。

こちらを参照してください。 https://dev.mysql.com/doc/refman/5.7/ja/comparison-operators.html#operator_equal-to

12
obe

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
11
minhas23

クエリが同じ問題を抱えていた:

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

値を返しませんでした。 MyISAMに問題があるように思われ、InnoDB内のデータに対する同じクエリが予想される結果を返しました。

一緒に行きました:

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

期待される結果をすべて返しました。

8
RichKenny
SELECT pid FROM planets WHERE userid is null;
2
user

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

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

この文は私のシナリオではうまくいきました。

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