使用NOT EQUAL运算符时处理NULL

时间:2016-06-02 09:42:28

标签: mysql null comparison equals

我有表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)

这似乎是一种解决这个问题的方法。有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

您还可以使用&lt; =&gt; 运算符。

查看

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)]>

答案 1 :(得分:0)

我会改用not in运算符:

... WHERE A.column_2 NOT IN (B.column_2,B.column_3,B.column_4)