【问题标题】:Why will mySQL not return a row with a null value when selecting != to a string为什么选择 != 到字符串时 mySQL 不会返回具有空值的行
【发布时间】:2014-02-03 05:56:33
【问题描述】:

我有一个可以为空的 varchar 列的表。选择行并指定我想要带有不等于给定字符串的值的行时,它不会返回值为null的行。

例如:

## if `value` is null, that row is ignored
SELECT * FROM test_table WHERE value != 'some string'

我想知道为什么会这样。

示例: http://sqlfiddle.com/#!2/83f0d/1

【问题讨论】:

标签: mysql


【解决方案1】:

ANSI SQL 中,NULL 既不等于也不不等于任何值,包括它自己。

NULL = 'foo'
NULL != 'foo'
NULL = NULL
NULL != NULL

全部计算为NULL。要测试是否为空,您必须在查询中使用 is nullis not null

【讨论】:

  • 可以说,以上表达式都没有计算为FALSE。他们评估为NULL,这是“不真实的”,但同样是“不真实的”。
  • @Michael-sqlbot:我仍然会说它的计算结果为FALSE,因为比较必须返回BOOLEAN。如果不是TRUE,则必须是FALSE
  • @Fr0zenFyr 您的语句 comparison must return a BOOLEAN 在 ANSI SQL 中不正确。
  • 好吧,那么有趣的是,标准(在幕后)似乎使用了 strict 比较,它具有三个谓词 - TRUEFALSENULL(相当于 void /null/undefined 在各种编程语言中 - 我知道将 SQL 与编程语言进行比较听起来很愚蠢,但 SQL 是此类语言的后端模型,因此在某些情况下可能有意义)。找到了this post (SO answer),它用漂亮的真值表说明了差异,以帮助理解 (ANSI) SQL 中的简单比较与IS 运算符。
  • 感谢您的简单解释。帮助我调试了一个存储过程并让它按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多