特定の列にNULLを含む行を選択しようとすると、空のセットが返されるという問題があります。ただし、phpMyAdminのテーブルを見ると、ほとんどの行でnullと表示されています。
私の質問はこんな感じです。
SELECT pid FROM planets WHERE userid = NULL
毎回空のセット。
実際の値の代わりに "NULL"や "null"として格納されていないことを確認するために多くの場所で言われていて、スペース(userid = ' '
)だけを探してみると言われました。 MyISAMにはnullの格納に問題があるため、MyISAMを使用せずにinnoDBを使用するという提案がありました。テーブルをinnoDBに切り替えたのですが、変換する方法が原因で、実際にはまだnullではないという問題があるかもしれません。私は、テーブルをinnoDBまたは他の何かとして再作成する必要なしにこれをしたいのですが、もしそうしなければ、私は確かにそれを試すことができます。
SQL NULLは特別なもので、NULLは何にもなり得ないため、WHERE field IS NULL
を実行する必要があります。
自分自身も含めます(つまり、NULL = NULLは常に偽です)。
Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rules を参照してください。
SELECT pid FROM planets WHERE userid IS NULL
すべてが答えを与えられているので、私はもう少し加えたいと思います。私も同じ問題に直面していました。
クエリが失敗したのはなぜですか?あなたが持っている、
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
演算子を使用します。
NULL
であるかどうかをテストします。NULL
ではないかどうかをテストします。<=>
演算子もあります。
SELECT pid FROM planets WHERE userid <=> NULL
うまくいくでしょう。いいことに、<=>
はNULL以外の値でも使用できます。
SELECT NULL <=> NULL
は1
を生成します。
SELECT 42 <=> 42
は1
も生成します。
こちらを参照してください。 https://dev.mysql.com/doc/refman/5.7/ja/comparison-operators.html#operator_equal-to
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
クエリが同じ問題を抱えていた:
SELECT * FROM 'column' WHERE 'column' IS NULL;
値を返しませんでした。 MyISAMに問題があるように思われ、InnoDB内のデータに対する同じクエリが予想される結果を返しました。
一緒に行きました:
SELECT * FROM 'column' WHERE 'column' = ' ';
期待される結果をすべて返しました。
SELECT pid FROM planets WHERE userid is null;
データベースをAccessからMySQLに変換するとき(vb.netを使用してデータベースと通信するとき)も同じ問題がありました。
フィールド(フィールドタイプvarchar(1))がnullかどうかを評価する必要がありました。
この文は私のシナリオではうまくいきました。
SELECT * FROM [table name] WHERE [field name] = ''