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。