为什么一个SQL查询返回的结果与过滤器始终为true的结果不同?

时间:2013-11-02 23:20:27

标签: sql-server tsql sql-server-2012

我在用户定义的标量函数中有以下SQL查询:

declare @csv varchar(8000)

select  @csv = 
    COALESCE(@csv + ', ' +  CAST(CallID as varchar(10)),
                            CAST(CallID as varchar(10)))
from    calls
where   1=1             --@csv = '6097'
        callid = callid --@csv = '1, 2, 3'...
        callid <= 10000 --always true, expected result (@csv = '1, 2, 3'...)
order by callid

select @csv

如果我使用1 = 1 where where条件,我得到@csv ='6097'(表中的最大CallID)。如果我使用callid = callid,callid&lt; = 10000,我得到了预期的结果:@csv ='1,2,3,'...如果我删除WHERE或ORDER BY子句,这也是结果。

有没有人知道为什么会这样?我有另一种情况发生,但功能有点复杂。我创建了一个全新的表,其中一个ID为int null null主键字段,填充1-6097,并尝试上面的查询,它从未给我'6097'的意外结果。这是我在SQL Server中遇到的最令人困惑的问题,所以如果有人有指示我的方向,我会非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

你的callid列在倒数第二行返回NULL。这会导致累加器在1 = 1的情况下重置,并导致callid = callid在另一种情况下失败(因为NULL = NULL为False)。

解决方案是将你的callid用法包装在COALESCE Calls中。