Sql WHERE子句谓词的计算结果是否可以为NULL?
WHERE子句是否可以返回NULL而不是TRUE或FALSE? 根据下面的练习,这是可能的,但我无法想象一个返回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
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
选择0为空,0为非空,“为空”,“非空,空!=NULL,NULL=NULL,NULL!='',NULL='
正确答案是D。请看这里:因此aNULL==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变量或列。