【问题标题】:MYSQL syntax not evaluating not equal to in presence of NULLMYSQL 语法不评估不等于存在 NULL
【发布时间】:2013-04-17 16:34:05
【问题描述】:

我在使用 mysql 查询时遇到问题。我想排除 2 的值。所以我想我会做以下事情:

table products

id | name     | backorder
-------------------
1  | product1 | NULL
2  | product2 | NULL
3  | product3 | 2

SELECT name from `products` p
WHERE backorder <> '2'

但是,这并没有给出 product1 的预期结果,product 2 它给出了一个空的结果表。

另一方面,如果我使用

SELECT name from `products` p
WHERE backorder = '2'

然后它产生:product3。但我想得到那些不等于2的记录。

&lt;&gt; '2' 出现问题。会不会是 NULL 值把它扔掉了?任何人都可以提出修复建议。

提前致谢!

【问题讨论】:

  • 您可以使用NULL-安全相等运算符:WHERE NOT backorder &lt;=&gt; 2

标签: mysql sql


【解决方案1】:

使用IS NULLIS NOT NULL 来比较NULL 的值,因为它们是未知的。

SELECT name 
from   products p
WHERE  backorder IS NULL OR backorder <> 2

【讨论】:

  • 那行得通。当 SO 允许时将标记为正确。一个问题...有些记录的值为 1。为了允许值为 NULL 或 1 的情况,我应该能够执行类似 (backorder IS NULL OR backorder ='1') 的操作。目前这对我不起作用。
  • 澄清一下,您想同时获得NULL1 的值吗?
  • 是的,我想要除了 value=2 以外的所有东西
  • 那么您想获取除backorder = 2 之外的所有记录吗?然后使用此条件backorder IS NULL OR backorder &lt;&gt; '2' 在这里演示:sqlfiddle.com/#!2/e0e57/2
  • 是否必须进行单独的 NULL 检查,因为“未知值”可能意味着“嗯,它可能是您正在寻找的值,但我只是不知道”?
【解决方案2】:

试试这个看看。

SELECT name from `products` p
WHERE backorder != '2'

【讨论】:

【解决方案3】:

抱歉打开这个

我们也可以用这个

SELECT name 
from   products p
WHERE  COALESCE(backorder,1)  <> 2

【讨论】:

  • 这破坏了添加索引的能力
【解决方案4】:

使用&lt;=&gt; 运算符。

你可以使用:

SELECT `name` FROM `products` `p`
WHERE NOT `backorder` <=> '2'

SELECT `name` FROM `products` `p`
WHERE !(`backorder` <=> '2')

有关&lt;=&gt; 运算符的更多信息,请参阅此答案:

What is this operator <=> in MySQL?

【讨论】:

  • 哇,效果很好。我不知道&lt;=&gt; 存在。我正在用更多的上下文更新你的答案......
  • 太棒了!谢谢@JoshuaPinter
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2021-10-20
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多