Sql WHERE子句谓词的计算结果是否可以为NULL?

Sql WHERE子句谓词的计算结果是否可以为NULL?,sql,oracle,null,where,clause,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

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.

为了解释原因,考虑SQL语言使用三值逻辑:<代码>真< /代码>,<代码> false ,和<代码> null <代码>。让我们考虑一下这个订单表,

如果我们运行下面的查询,它将不会返回CPU和监视器的行

SELECT * FROM Orders WHERE (qty < 1000 Or qty >= 1000)
从订单中选择*,其中(数量<1000或数量>=1000)
在这种情况下,对于CPU和监视器条件
(数量<1000或数量>=1000)
既不返回
TRUE
也不返回
FALSE
。它返回
NULL
。因为逻辑上它是未知的。因此,
WHERE
子句中的条件的结果是未知的,它返回NULL


可以考虑这一点。在SQL中,

< P>,所有逻辑运算符在MySQL未知结果调用NULL()、

中计算为真、假和未知()。 根据oracle文档:

要测试空值,请仅使用比较条件IS NULL和IS 不为NULL。如果使用任何其他具有NULL的条件,则 取决于null的值,则结果未知。“

因此,求值后只能返回TRUE、FALSE和UNKNOWN

关于你的问题:

“WHERE子句是否可以返回NULL而不是TRUE或FALSE?”

严格来说,在Oracle中-,因为这样的结果称为未知

但一般来说,在这个上下文中,UNKNOWN和NULL的含义是等价的,它只是同一事物的不同名称。 因此下面的SQL示例(
a.a>=all
)被评估为未知

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)
即使是NULL也不能等于NULL

  • 理解NULL的正确方法是它不是一个值。不 “这是一个空值”,但“这不是一个空值。”所有 要么是一个值,要么不是
  • 当某物是一个值时,它是“1”,或“hello”,或“green”,或 “$5.00”等等——但当某件东西不是价值时,它就不是了 什么都可以
  • SQL通过特殊的非值NULL表示“this has no value”。 当有人说“空值”时,人们应该在心理上不同意, 因为根本就没有这回事。NULL是完全的,完全的缺席 有任何价值的。 强调文本
  • 非技术方面

    如果你问两个女孩,她们多大了?也许你会听她们说 拒绝回答你的问题,两个女孩都给你零年龄 这并不意味着两人的年龄相近,所以没有什么东西可以做到 等于null


    选择0为空,0为非空,“
    为空”,“非空,空!=NULL,NULL=NULL,NULL!='',NULL='

    正确答案是D。请看这里:因此a
    NULL==NULL
    将返回
    未知
    。对吗?@SuhasK根据他们的文档,是的。在标准SQL中,
    未知
    是不同的c仅mysql(据我所知)这将二者混为一谈。@Damien\u不信者谢谢,我已经更正了我的答案。标准SQL描述了一种三值逻辑,其中可能的值是
    TRUE
    FALSE
    UNKNOWN
    。据我所知,只有mysql将
    UNKNOWN
    NULL
    @Damien\u不信者否,MS SQL也做同样的事情。既然
    UNKNOWN
    NULL
    的行为应该是完全相同的,我真的不明白你为什么要为同一件事使用两个关键字。在任何情况下,你是对的,不管出于什么原因,ANSI SQL都有
    UNKNOWN
    NULL
    。@Luaan-不是根据:“比较运算符的结果具有布尔数据类型。这有三个值:TRUE、FALSE和UNKNOWN”@Damien_The_Unsensiver有趣。它们隐藏得相当好-没有
    UNKNOWN
    关键字,但是
    (null=null)is null
    是一个语法错误(因为,正如您所指出的,布尔值不能为
    null
    )。我想这种区别并不明显,因为MS SQL实际上没有“公共”bool类型-只有布尔表达式才有bool类型,不能有bool文本,也不能有bool变量或列。