MySQL: WHERE status NOT LIKE 'example%' 没有返回 NULL 状态的结果

MySQL: WHERE status NOT LIKE 'example%' isn't returning results with NULL status

我有一个 table 如下所示:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
| Waldo   |   37     | NULL            |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+

当我执行这样的查询时:

SELECT * FROM records WHERE status NOT LIKE 'example%'

我得到:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+

如果我将查询更改为(注意 我删除了 NOT):

SELECT * FROM records WHERE status LIKE 'example%'

然后我得到以下信息:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+

我的问题是:Waldo 在哪里?

在SQL中,NULL值无法参与大多数比较操作,包括LIKE,您必须使用IS NULL单独考虑NULL值运算符:

WHERE (`status` NOT LIKE '%example%' OR `status` IS NULL)

这很愚蠢,但这就是生活。

此处记录:https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

You cannot use [...] comparison operators such as =, <, or <> to test for NULL. Because the result of any [...] comparison with NULL is also NULL, you cannot obtain any meaningful results from such comparisons.

我不确定 为什么 MySQL 不喜欢在 NULL 值上处理 LIKE,但解决方案适用于我正在将查询更改为以下内容:

SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%')

我找不到关于这个问题的任何文档,所以如果有人有一些好的东西请分享,但至少这是有效的。

答案在three valued logic中。 WHERE 子句将仅过滤谓词 计算结果为 TRUE 的行。它将过滤掉谓词计算结果为 FALSENULL 的行。由于 null like somethingNULL 它不会出现在结果中。