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 的行。它将过滤掉谓词计算结果为 FALSE
或 NULL
的行。由于 null like something
是 NULL
它不会出现在结果中。
我有一个 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 的行。它将过滤掉谓词计算结果为 FALSE
或 NULL
的行。由于 null like something
是 NULL
它不会出现在结果中。