为了账号安全,请及时绑定邮箱和手机立即绑定

非IN子句和空值

非IN子句和空值

德玛西亚99 2019-06-06 15:55:13
非IN子句和空值这个问题出现时,我得到了不同的记录计数,我认为是相同的查询之一使用not in where约束和另一个约束left join..的桌子not in约束有一个空值(坏数据),这将导致该查询返回0条记录的计数。我有点理解为什么,但是我需要一些帮助来充分理解这个概念。简单地说,为什么查询A返回一个结果而B不返回?A: select 'true' where 3 in (1, 2, 3, null)B: select 'true' where 3 not in (1, 2, null)这发生在SQLServer 2005上。我还发现set ansi_nulls off使B返回结果。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

查询A与以下内容相同:

select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null

3 = 3是真的,你得到了结果。

查询B与以下内容相同:

select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null

什么时候ansi_nulls开着呢,3 <> null是未知的,因此谓词的计算结果是未知的,因此不会得到任何行。

什么时候ansi_nulls离开了,3 <> null为true,因此谓词的计算结果为true,然后得到一行。


查看完整回答
反对 回复 2019-06-06
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

每当您使用NULL时,您实际上是在处理一个三值逻辑。

当WHERE子句的计算结果为:

    3 = 1 or 3 = 2 or 3 = 3 or 3 = nullwhich is:
    FALSE or FALSE or TRUE or UNKNOWN
which evaluates to 
    TRUE

第二项:

    3 <> 1 and 3 <> 2 and 3 <> nullwhich evaluates to:
    TRUE and TRUE and UNKNOWN
which evaluates to:
    UNKNOWN

未知与false不同,您可以通过调用以下命令轻松地对其进行测试:

select 'true' where 3 <> nullselect 'true' where not (3 <> null)

这两个查询都不会给出结果。

如果未知与false相同,那么假设第一个查询会给出false,那么第二个查询将不得不计算为true,因为它将与NOT(False)相同。
情况并非如此。

有一个很好的关于SqlServerCentral的文章.

一开始,关于NULL和三值逻辑的整个问题可能有点混乱,但要想在tsql中编写正确的查询,就必须要理解这些问题。

我推荐的另一篇文章是SQL聚合函数和NULL.


查看完整回答
反对 回复 2019-06-06
?
冉冉说

TA贡献1877条经验 获得超1个赞

NOT IN当与未知值比较时,返回0条记录。

NULL是未知的,NOT IN查询包含NULLNULL在可能的值列表中,s将始终返回。0记录,因为无法确定NULL值不是正在测试的值。


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 452 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信