WHERE子句谓词可以评估为NULL吗?

时间:2016-01-07 03:19:51

标签: sql oracle null where clause

WHERE子句可以返回NULL而不是TRUE或FALSE吗? 根据下面的练习,它是可能的,但我无法想象一个返回NULL的例子,它真的可能吗?

4. Which of the following values can NOT be returned after evaluation of WHERE clause
condition?
A.  UNKNOWN
B.  TRUE
C.  FALSE
D.  NULL
Answer: A. If the result of the condition in WHERE clause is not known, NULL is returned. In all
other scenarios, either TRUE or FALSE is returned.

3 个答案:

答案 0 :(得分:2)

在SQL中,MySQL UNKNOWN结果中的所有逻辑运算符求值为TRUE,FALSE和UNKNOWN(Oracle docs)为NULL(MySQL docs)。

根据oracle文档:

  

"要测试空值,请仅使用IS NULL和IS的比较条件   不是NULL。如果您使用任何其他条件的空值和结果   取决于null的值,然后结果是UNKNOWN。"

因此,评估后只能返回TRUE,FALSE和UNKNOWN。

关于您的问题:

  

" WHERE子句可以返回NULL而不是TRUE或FALSE吗?"

严格地说在Oracle中 - NO 因为这样的结果叫做UNKNOWN。

但总的来说,UNKNOWN和NULL的含义在这个上下文中是等价的,它只是同一个东西的不同名称。 所以下面的SQL示例(a.a >= all)评估为UNKNOWN。

with table_a as (
select null as a from dual
union all 
select 10 as a from dual
union all 
select 5 as a from dual),
table_b as (
select null as a from dual
union all 
select 10 as a from dual
union all 
select 5 as a from dual)

select * from table_a a where a.a >= all(select a from table_b b)

答案 1 :(得分:0)

为了解释原因,请考虑SQL语言使用三值逻辑:TRUEFALSENULL。我们来考虑一下这个Orders表,

enter image description here

如果我们运行以下查询,它将不会返回CPU和Monitor

的行
SELECT * FROM Orders WHERE (qty < 1000 Or qty >= 1000)

在这种情况下,对于CPU和监视器条件,(qty < 1000 Or qty >= 1000)既不返回TRUE也不返回FALSE。它返回NULL。因为逻辑上它是未知的。因此,WHERE子句中的条件结果是未知的,并返回NULL。

您可以考虑这个reference

答案 2 :(得分:0)

  

即使NULL也不能等于NULL。

  1. 理解NULL的正确方法是它不是一个值。不 “这是一个NULL值”,但“这个NULL不是一个值。”一切 要么是价值,要么不是。
  2. 当某个值是值时,它是“1”,“hello”或“green”,或者 “5.00美元”等 - 但是当某些东西不是价值时,它就不是 什么都没有。
  3. SQL通过特殊的非值NULL表示“这没有值”。 当有人说“空值”时,人们应该在心理上不同意, 因为没有这样的事情。 NULL是完整的,完全缺席 任何有价值的。 强调文字
  4. 非技术方面

      

    如果你问两个女孩,她们多大了?也许你会听到他们   拒绝回答你的问题,两个女孩都给你NULL作为年龄   这并不意味着两者都有相似的年龄。所以没有什么可以   等于null。

    SELECT 0 IS NULL , 0 IS NOT NULL , '' IS NULL , '' IS NOT NULL, NULL != NULL, NULL = NULL, NULL != '', NULL = ''