非IN子句和空值

非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返回结果。


德玛西亚99
浏览 456回答 3
3回答

青春有我

查询A与以下内容相同:select&nbsp;'true'&nbsp;where&nbsp;3&nbsp;=&nbsp;1&nbsp;or&nbsp;3&nbsp;=&nbsp;2&nbsp;or&nbsp;3&nbsp;=&nbsp;3&nbsp;or&nbsp;3&nbsp;=&nbsp;null自3 = 3是真的,你得到了结果。查询B与以下内容相同:select&nbsp;'true'&nbsp;where&nbsp;3&nbsp;<>&nbsp;1&nbsp;and&nbsp;3&nbsp;<>&nbsp;2&nbsp;and&nbsp;3&nbsp;<>&nbsp;null什么时候ansi_nulls开着呢,3 <> null是未知的,因此谓词的计算结果是未知的,因此不会得到任何行。什么时候ansi_nulls离开了,3 <> null为true,因此谓词的计算结果为true,然后得到一行。

繁花不似锦

每当您使用NULL时,您实际上是在处理一个三值逻辑。当WHERE子句的计算结果为:&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;=&nbsp;1&nbsp;or&nbsp;3&nbsp;=&nbsp;2&nbsp;or&nbsp;3&nbsp;=&nbsp;3&nbsp;or&nbsp;3&nbsp;=&nbsp;nullwhich&nbsp;is: &nbsp;&nbsp;&nbsp;&nbsp;FALSE&nbsp;or&nbsp;FALSE&nbsp;or&nbsp;TRUE&nbsp;or&nbsp;UNKNOWN which&nbsp;evaluates&nbsp;to&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;TRUE第二项:&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;<>&nbsp;1&nbsp;and&nbsp;3&nbsp;<>&nbsp;2&nbsp;and&nbsp;3&nbsp;<>&nbsp;nullwhich&nbsp;evaluates&nbsp;to: &nbsp;&nbsp;&nbsp;&nbsp;TRUE&nbsp;and&nbsp;TRUE&nbsp;and&nbsp;UNKNOWN which&nbsp;evaluates&nbsp;to: &nbsp;&nbsp;&nbsp;&nbsp;UNKNOWN未知与false不同,您可以通过调用以下命令轻松地对其进行测试:select&nbsp;'true'&nbsp;where&nbsp;3&nbsp;<>&nbsp;nullselect&nbsp;'true'&nbsp;where&nbsp;not&nbsp;(3&nbsp;<>&nbsp;null)这两个查询都不会给出结果。如果未知与false相同,那么假设第一个查询会给出false,那么第二个查询将不得不计算为true,因为它将与NOT(False)相同。情况并非如此。有一个很好的关于SqlServerCentral的文章.一开始,关于NULL和三值逻辑的整个问题可能有点混乱,但要想在tsql中编写正确的查询,就必须要理解这些问题。我推荐的另一篇文章是SQL聚合函数和NULL.

冉冉说

NOT IN当与未知值比较时,返回0条记录。自NULL是未知的,NOT IN查询包含NULL或NULL在可能的值列表中,s将始终返回。0记录,因为无法确定NULL值不是正在测试的值。
打开App,查看更多内容
随时随地看视频慕课网APP