这是两个测试表的 sqlfiddle:http ://sqlfiddle.com/#!9/33361/3
tl;博士:为什么不!= 0
包含NULL
值的 SQL 查询?
我将加入这两个表。我想查看具有NULL
intableB.field1
或 a 1
in 的行tableB.field1
,但排除所有具有0
in 的行tableB.field1
。
我认为这个查询(示例 6)应该给我这个结果,但它没有得到空记录。
SELECT * FROM tableA a
LEFT JOIN tableB b ON a.id = b.join_id
WHERE
b.field1 != 0;
我必须使用这个更长的查询(示例 4):
SELECT * FROM tableA a
LEFT JOIN tableB b ON a.id = b.join_id
WHERE
b.field1 != 0 OR b.field1 IS NULL;
只是好奇——MySQL 怎么不认为 NULL 是 != 0?
当我将条件移动到 ON 子句时,我得到了一个意外的行:
mysql> SELECT * FROM tableA a
-> LEFT JOIN tableB b ON a.id = b.join_id AND b.field1 != 0;
+------+--------+--------+---------+--------+--------+
| id | field1 | field2 | join_id | field1 | field2 |
+------+--------+--------+---------+--------+--------+
| 1 | testA1 | testA1 | 1 | 1 | testB1 |
| 2 | testA2 | testA2 | NULL | NULL | NULL |
| 3 | testA3 | testA3 | NULL | NULL | NULL |
+------+--------+--------+---------+--------+--------+
3 rows in set (0.00 sec)