【问题标题】:Output of "select 1 where NULL <> -1;" [duplicate]“select 1 where NULL <> -1;”的输出[复制]
【发布时间】:2016-09-17 18:30:58
【问题描述】:

我想我还没有完全理解 SQL 中 NULL 的含义。我运行了这个 SQL,我希望看到 1 作为输出,但我没有看到:

select 1 where NULL <> -1;

NULL 和 -1 不是不同吗?谁能解释一下为什么“NULL -1”这个子句是 FALSE?

【问题讨论】:

  • 基本上,除IS NULL 之外的所有比较都返回“false”或“NULL”。也就是说,它们永远不会为真,并且行会被过滤掉。
  • NULL 不是值,因此无法比较。
  • 这就是为什么我们声明 something IS NULL 而不是 something = NULL
  • 任何与 NULL 的比较都会导致 Unkown 结果,即使 NULL = NULL 也不是 True。

标签: sql


【解决方案1】:

NULL 不是一个值,因此不能与任何其他值进行比较,也不能得到除 null 之外的任何其他结果。 Docs。和how 比较空值。

【讨论】:

  • 我不知道 OP 使用的是什么 RDBMS,但我认为它不是 Oracle。 Oracle 不应该接受 OP 的语法 IIRC,它需要 from
  • @hvd:关于如何处理表达式中的 NULL 值的说明对于任何 SQL 方言仍然有效
  • @a_horse_with_no_name 通常是的,但链接的文档也包含特定于 Oracle 的详细信息,至少是关于零长度字符串的警告和一些非标准函数的提及。这对 OP 没有用处。
【解决方案2】:

NULL 表示未知。因此,对于where NULL &lt;&gt; -1,您想知道未知值是否等于-1。 DBMS 不知道(当然),所以表达式的结果既不是TRUE 也不是FALSE;是NULL

仅选择WHERE 子句导致TRUE 的行。由于您的表达式不会导致TRUE,而是NULL,因此没有选择任何行。

【讨论】:

  • 实际上与 NULL 比较的结果是 UNKNOWN,而不是 NULL。
  • @dnoeth:不,NULL 未知的数据库名称。试试select 1 where (null = -1) is null。 (这里是对 PostgreSQL 的测试:sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/11585.
  • 一列可以是NULL,但绝不是比较的结果,这就是标准SQL(以及PostgreSQL)中有IS UNKNOWN的原因。查看books.google.de/…周围的页面
  • @dnoeth:谢谢,我不知道。我所知道的是,表达式会产生一个值,例如字符串值(例如 a || b)或数值(例如 a + b)或布尔值(例如 a 或 b)。我不知道布尔数据类型因此应该包含TRUEFALSEUNKNOWN;我以为是TRUEFALSENULL。但是我已经在 SQL 2003 草案中阅读了它;它表明它确实应该是UNKNOWN,但允许DBMS 使用NULL。我想UNKNOWN 的行为应该与NULL 完全一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多