2012-04-29 62 views
1

我想在我的查詢中做一個這樣的事情,但它沒有采用AND部分,它說它的語法錯誤,它也不會採用& &。我將不勝感激任何幫助,因爲我不是一個SQL大師。這種使用條件的表達式有什麼問題?

Total = 
       CASE Payment.ID 
        WHEN 1 THEN mytable.Total 
        WHEN 4 AND trans.Amount IS NULL THEN mytable.Total 
        WHEN 4 AND trans.Amount IS NOT NULL THEN mytable.Total - trans.Amount 
        ELSE '0' 
       END, 
+0

我實際上在這裏看不到任何使用的變量,標題錯誤或者是否遺漏或更改了一些代碼? – 2012-04-29 05:24:06

+0

不,我認爲有人爲我改變它... – user710502 2012-04-29 06:03:09

+0

我改變了..不知道是誰改變它說我正在使用「變量」 – user710502 2012-04-29 06:05:46

回答

5

這是一種方法。將表達式改爲像這樣。

腳本

Total = (CASE 
      WHEN Payment.ID = 1 
       THEN mytable.Total 
      WHEN Payment.ID = 4 
       AND trans.Amount IS NULL 
        THEN mytable.Total 
      WHEN Payment.ID = 4 
       AND trans.Amount IS NOT NULL 
        THEN mytable.Total - trans.Amount 
      ELSE '0' 
     END), 

有兩種類型的CASE表達的即SimpleSearched。您不能在同一個表達式中組合Simple和Searched。

簡單

CASE input 
    WHEN 1 THEN 'a' 
    WHEN 2 THEN 'b' 
    WHEN 3 THEN 'c' 
    ELSE '' 
END 

搜索 - Example 1:最簡單的形式。

CASE 
    WHEN input = 1 THEN 'a' 
    WHEN input = 2 THEN 'b' 
    WHEN input = 3 THEN 'c' 
    ELSE '' 
END 

搜索 - Example 2:涉及多個列。您可以在每個WHEN語句中添加多個列。

CASE  
    WHEN input = 1 AND second_column = 2 THEN 'a' 
    WHEN input = 2 AND third_column = 3 THEN 'b' 
    WHEN input = 3 AND (second_column = 4 OR third_column = 6) THEN 'c' 
    ELSE '' 
END 
+0

值得指出*搜索的優勢* - 條件不都必須涉及相同的列('input'),並且可以是任意複雜的。 – 2012-04-29 03:31:21

5

我認爲這是一個更簡單的表達了相同的查詢方式:

Total = CASE Payment.ID 
    WHEN 1 THEN myTable.Total 
    WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0) 
    ELSE 0 
END, 

我們只有真正需要的一個條件爲Payment.ID = 4,因爲只有兩種可能的結果(我們要麼要減去trans.Amount或者我們不是,我們可以通過使用COALESCE(或ISNULL))來簡化。當然,還有其他方式可以表達它們,它們都有其優點。如果myTable.Total實際上是一個更復雜的表達,則它可能是更有效的,至少在按鍵方面,只提的是表達一次,你可以通過做洗牌周圍位的邏輯:

Total = CASE WHEN Payment.ID IN (1,4) 
    THEN myTable.Total - CASE WHEN Payment.ID = 4 THEN 
    COALESCE(trans.Amount, 0) ELSE 0 END 
    ELSE 0 
END, 

最接近的有效語法你原來的代碼是:

Total = CASE 
    WHEN Payment.ID = 1 THEN 
    myTable.Total 
    WHEN Payment.ID = 4 AND trans.Amount IS NULL THEN 
    myTable.Total 
    WHEN Payment.ID = 4 AND trans.Amount IS NOT NULL NULL THEN 
    mytable.Total - trans.Amount 
    ELSE 
    0 
END, 

但在這種情況下,你在裏面有重複的很多,和你提到一個表達三次。在某些情況下,這可能會對性能造成不利影響(想象一下,如果該表達式計算起來很昂貴,例如子查詢或UDF調用,並且查詢邏輯導致它不止一次計算)。有時候引擎會做引擎要做的事情,不管你試圖超越它,但是如果你不小心的話,你肯定會把它引向錯誤的道路。

關鍵是瞭解CASE是一個返回單個值的表達式。許多人來自其他語言,並且認爲這是一種可用於控制流量的聲明。

+0

您的「更簡單」的查詢在不應該 - 特別是Payment.ID = 1時減去trans.Amount。除非我錯過了問題中的某些內容,否則更簡單的查詢會在ID = 1且Amount isn'時給出錯誤結果' t null或零。 – 2012-04-29 04:46:45

+0

完全正確的史蒂夫,趕上!完全刪除了該版本。 – 2012-04-29 04:54:58

+0

COALESCE做什麼? – user710502 2012-04-29 06:04:38

相關問題