Be careful on NULL in Sql Server
昨天在我们的一个程序发现了一个Bug, 程序是给Accounting用的一个Report,但是Accounting的人发现无论如何这个Report抓不出数据,跟进去查了一下,发现查数据的Sql是类似这样的:
Select * from table_1 where sonumber not in
(select sonumber from table_2
union all
select sonumber from table_3
)
数据在Table_1里是存在的,table_2/3 里也不包含对应的SOnumber,但是Query的结果就是没有数据。再查了一下,发现原因在于Table_2中有些SoNumber的值是Null,而 where [field] not in (null) 这个判断,在Sql 里总是会返回false的 (偶这里的SET ANSI_NULLS 是ON,不过好像偶没见谁用过OFF)
改了一下in里的Select,处理掉NULL值以后Bug Fix
-------------------------------
潜水N久,俺又回来了。 最近会玩弄一些Biztalk 和 SAP R3互联方面的东西,今天这个算一小泡泡。
newegg?
newegg? Steven?
@ chengbo:
Newegg不错。
@xzwplus:
Steven 错了。 BTW,偶也不是小S haha
@Zee:
我看到发mail的是Steven He, 还以为就是你呢。汗~~~
做过R3和.NET集成,也做过Biztalk的集成,还没有做过这两者的集成,倒是很希望和楼主沟通一下,互通有无。
msn:bucher(at)msn.com
呵呵,好久不见博了. 偶知道楼主是谁,US那边的。
BTW,小S是谁?
Zee,你终于现身了,最近在哪混?
@Riven Huang
俺还在老地方啊。快3年了都。 你最近怎么样?
null在数据库中是很特殊的一个值,null<>null,基本上null进行数值运算,例如null+null返回的也是null,并且返回的null不等于任何一个null,所以null一般用is来处理。相关的理论你可以搜索3VL(3 values logic)
有一些函数会忽略null来进行处理,而有一些则不会忽略。。。例如sum/avg等(如果我没记错的话)会忽略null值,而count不会忽略。group by也会将所有的null值归为一类。
反正null是一个需要特别留意的值。如果你研究深入一些,会发现它其实挺有意思的。。