mysql - 使用 NOT EQUAL 运算符时处理 NULL

标签 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)

这似乎是一种迂回的处理方式。有没有更好的方法来处理这个问题?

最佳答案

您还可以使用<=>运算符。

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/

相关文章:

将 char 与整数进行比较

PHP & ZF2/比较 : expected == actual

SQL 比较工具

mysql - PyroCMS(Laravel) 翻译中的 where 子句无法正常工作

mysql - 如何在 2 个 MySQL 数据库之间传输数据?

mysql - 导入MySQL数据库后日期发生变化

mysql - 我的 mysql 触发器发生了严重的故障是什么?

mysql - 如何创建所有列都不是 NULL 的 MySQL 表?

sql - MySQL - NULL 值检查和存储过程中的动态 SQL

php - 错误的查询在特定行中插入值