【发布时间】:2016-03-10 16:31:29
【问题描述】:
这是两个测试表的 sqlfiddle:http://sqlfiddle.com/#!9/33361/3
tl;dr:为什么带有 != 0 的 SQL 查询不包含 NULL 值?
我正在左连接这两个表。我想查看在tableB.field1 中具有NULL 或在tableB.field1 中具有1 的行,但排除所有在tableB.field1 中具有0 的行。
我认为这个查询(示例 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)
【问题讨论】:
-
第一个例子是否定
outer join——您可以将该条件移至on,它应该可以在没有null检查的情况下正常工作。
标签: mysql null comparison sqlfiddle