2014-02-11 119 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]