2012-07-16 5 views
32

これは、MySQLでのテーブル結合についての私の最後の質問に続く質問ですMYSQL Left JoinどのようにNULL値を選択しますか?

左の結合テーブルからNULL値を選択できる必要があります。

ここに私の参加です:

table1.id | table1.name | table2.id | table2.surname 
     1 |  John |   1 |   Doe 
     2 |  Michael |   2 |  Anderson 
     3 |  Anna |  NULL |   NULL 
     4 |   Sue |  NULL |   NULL 

ない私はWHERE table2.surname = NULLを選択したいと思うが、このdoesntの仕事

SELECT table1.*,table2.* 
FROM table1 
LEFT JOIN table2 
    ON table1.id=table2.id 
WHERE table2.surname=NULL 

のようなクエリは、私は多少その背後のロジックを理解することができます私には何か結果がありますが、その結果を得る方法が必要ですか?

あなたはこのように、IS NULL述語を使用する必要がNULL値を比較するために任意のヘルプ

答えて

39

に感謝:

SELECT table1.*, table2.* 
FROM table1 
LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
+0

質問には直接関係しませんが、有意義な値を取得するには、結合の 'AND'節ではなく' WHERE'節を使用する必要があります。それは私をひっくり返していた。 – HartleySan

4

をしてみてください:あなたの代わりにIS NULLを使用する必要が

SELECT table1.*,table2.* 
FROM table1 
    LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
12

= NULL

WHERE table2.surname IS NULL 

NULLがそうしようと、基本的に「不明」と何(ではないとしても、それ自体)に等しいまたは等しくないできないですので、あなたは、単に= NULLを行うことができない理由があります正確な一致とみなされているかのように比較すると、期待されるブール値0または1の代わりにNULLが返されます。これは、クエリが空の結果を返す理由と同じです。

"不明です"は "不明と等しい"の間に明確な違いがあります。何かが不明または不明ではなく、未知のは不明であり、それは意味がありませんので、何か不明「に等しい」場合は、テストすることはできませんされている場合は、確実にテストすることができます。また

、MySQLを使用していることから、別のオプションはMySQL固有のNULLセーフ比較演算子をある<=>table2.surname <=> NULLを使用し、それを使用するだけの標準的なSQLの方法に固執しないようにしようとするだろう(IS NULL/IS NOT NULL

1

MySQL specificationによると、 "= NULL"ではなく "IS NULL"を使用する必要があります。 「(NULL = NULL)がNULLに等しい」と表示されます。しかし、NULLはBooleanとして使用されている間はFalseに等しくなります。

関連する問題