我有表 A,它与表 B“USING”column_1 连接。我希望查询显示表 A 中的所有行,其中 column_2 中的值不等于表 B 中联接行的 column_2、column_3 或 column_4 中的任何值。
所以,我尝试使用:
WHERE
A.column_2 <> B.column_2 AND
A.column_2 <> B.column_3 AND
A.column_2 <> B.column_4
现在,如果 B.column_2、B.column_3 和 B.column_4 中的每个单元格都有一些值,则查询检查将起作用,它将列出表 A 中 A.column_2 中的值不匹配的所有行在表B中。
如果表 B 中的某些单元格具有 NULL 值,就会出现此问题。那么就不会返回任何结果。这似乎是因为 MySQL 认为以下内容是 FALSE:
23 <> NULL
...由于查询正在查找所有检查都返回 TRUE 的情况,因此它不会返回任何内容。
下面是我采用的一种解决方法,将表 B 列用 IFNULL 包裹起来,其中 IFNULL 值为 0。本质上,这会将所有这些 NULL 单元格转换为 0...因此 NOT EQUAL 检查将当没有匹配项时正确返回 TRUE,并且将显示表 A 中的那些行。代码是这样的:
WHERE
A.column_2 <> IFNULL(B.column_2, 0) AND
A.column_2 <> IFNULL(B.column_3, 0) AND
A.column_2 <> IFNULL(B.column_4, 0)
这似乎是一种迂回的处理方式。有没有更好的方法来处理这个问题?
最佳答案
您还可以使用<=>运算符。
看
MariaDB [(none)]> SELECT 1 <> 1 , 1 <> 0 , 0 <> 0, 0 <> NULL , NULL <> 0 , 0 <=> NULL, NULL <=> 0, NULL <=> NULL;
+--------+--------+--------+-----------+-----------+------------+------------+---------------+
| 1 <> 1 | 1 <> 0 | 0 <> 0 | 0 <> NULL | NULL <> 0 | 0 <=> NULL | NULL <=> 0 | NULL <=> NULL |
+--------+--------+--------+-----------+-----------+------------+------------+---------------+
| 0 | 1 | 0 | NULL | NULL | 0 | 0 | 1 |
+--------+--------+--------+-----------+-----------+------------+------------+---------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
关于mysql - 使用 NOT EQUAL 运算符时处理 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37588152/