2014-02-11 89 views
0

我有当声明中提取查询这似乎并没有被返回什么,我期待案例不正确评估SQL Server的

DECLARE @Val1 int, @Val2 int,@Val3 int, @Val4 int, @Val5 int 

SELECT @Val1 = 5 , @Val2= 2,@Val3= 200000, @Val5 = 2,@Val4 = 2014 
SELECT @Val1 , @Val2,@Val3, @Val4, @Val5 

SELECT CASE 

     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NULL THEN 'ReturnValue1' 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NOT NULL THEN 'ReturnValue2' 
     WHEN @Val1 = 5 AND @Val2 = 2 AND @Val3 = 200000 AND @Val5 = 2 AND @Val4 IS NOT NULL THEN 'ReturnValue3' 
     ELSE NULL 
    END [TestingValue] 

我期待值是一个情况ReturnValue3但是由于某种原因它似乎忽略了整条线。

任何人都可以看到我没有发现的问题。

+0

当一个以上的情况是真实的,它将返回的第一个 – Mihai

+0

我也注意到,如果我在顶部位置放置它,然后工作的最后一行,但以为我是别人失去了一些东西。所以为了得到这个正确的,尽管最后的when语句有一个额外的值来检查SQL Server是否忽略了这一点? – Gelder

+0

它以第一个真实条件停止,是的。 – Mihai

回答

4

在大多数情况下

CASE语句计算条件依次其与第一条件,其条件得到满足

http://msdn.microsoft.com/en-us/library/ms181765.aspx

+0

[不,这并非总是如此](http://dba.stackexchange.com/questions/12941/does-sql-server-read-all-of-a-coalesce-function-even-if-the-first -argument-是-NO/12945#12945)。 –

1

ReturnValue3停止 是ReturnValue2的一个子集,因此您需要首先检查ReturnValue3,否则所有满足ReturnValue3的组合都将分配给ReturnValue2。

DECLARE @Val1 int, @Val2 int,@Val3 int, @Val4 int, @Val5 int 

SELECT @Val1 = 5 , @Val2= 2,@Val3= 200000, @Val5 = 2,@Val4 = 2014 
SELECT @Val1 , @Val2,@Val3, @Val4, @Val5 

SELECT CASE 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NULL 
     THEN 'ReturnValue1' 
     WHEN @Val1 = 5 AND @Val2 = 2 AND @Val3 = 200000 AND @Val5 = 2 AND @Val4 IS NOT NULL 
     THEN 'ReturnValue3' 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NOT NULL 
     THEN 'ReturnValue2' 
     ELSE NULL 
    END [TestingValue]