MySQL:其中状态不象';示例%';isn';t返回空状态的结果

MySQL:其中状态不象';示例%';isn';t返回空状态的结果,mysql,null,sql-like,Mysql,Null,Sql Like,我有一张如下所示的表: +---------+----------+-----------------+ | name | age | status | +---------+----------+-----------------+ | Clark | 25 | Example | +---------+----------+-----------------+ | Peter | 28 | Example2

我有一张如下所示的表:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
| Waldo   |   37     | NULL            |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+
+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%')
当我执行这样的查询时:

SELECT * FROM records WHERE status NOT LIKE 'example%'
我得到:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+
如果我将查询更改为(请注意,我删除了
而不是
):

然后我得到以下结果:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
| Waldo   |   37     | NULL            |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+
+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%')

我的问题是:<强>瓦尔多在哪里?

< P> > SQL,<代码> null <代码>值不能参与大多数比较操作,包括<>代码> ,相反,您必须分别考虑<代码> NULL/<代码>值,使用<代码>是NUL/<代码>运算符:

WHERE (`status` NOT LIKE '%example%' OR `status` IS NULL)
这很傻,但这就是生活

这里记录了这一点:

您不能使用[…]比较运算符,例如=,,我不知道为什么MySQL不喜欢对
NULL
值处理
like
,但对我有效的解决方案是将查询更改为以下内容:

+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
| Waldo   |   37     | NULL            |
+---------+----------+-----------------+
| Tarzan  |   31     | Unknown         |
+---------+----------+-----------------+
+---------+----------+-----------------+
| name    |   age    | status          |
+---------+----------+-----------------+
| Clark   |   25     | Example         |
+---------+----------+-----------------+
| Peter   |   28     | Example2        |
+---------+----------+-----------------+
SELECT * FROM records WHERE (status IS NULL OR status NOT LIKE 'example%')

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

答案在
三值逻辑中
WHERE
子句只过滤谓词计算结果为TRUE的行。它将过滤掉谓词计算结果为
FALSE
NULL
的行。因为
null类似的东西
null
所以不会有结果。

ah,谢谢@Dai,我其实已经知道答案了,我只是想把它放到StackOverflow上,给其他可能有问题的人看,但无论如何谢谢你的正确答案!您链接的文档虽然谈到了比较运算符,但没有提到类似于
运算符,我认为这是一个不同的构造。这种行为完全是出于设计,应该不会让任何人感到惊讶
NULL
是表示没有值的占位符,没有值的值不能正确地表示为与任何其他值相似或不相似。表达式
1>NULL
是真还是假?答案是“两者都不是”。显然,(2,0,4)的平均值是2,但(2,NULL,4)的平均值是3。