2009-07-13 30 views
18

語句我有一個是應該這樣運行查詢 -SQL Server 2008中 - 案例/如果在SELECT子句

 

If(var = xyz) 
    SELECT col1, col2 
ELSE IF(var = zyx) 
    SELECT col2, col3 
ELSE 
    SELECT col7,col8 

FROM 

. 
. 
. 

如何做到這一點的T-SQL,而無需編寫單獨的查詢每個條款?目前我正在它作爲

 

IF (var = xyz) { 
    Query1 
} 
ELSE IF (var = zyx) { 
    Query2 
} 
ELSE { 
    Query3 
} 

這只是大量的冗餘代碼只是選擇取決於不同的值的列。 任何替代品?

回答

18

這裏只需要說明一下,爲了優化的原因,您實際上最好選擇3個獨立的SELECTS。如果只有一個SELECT,那麼生成的計劃必須投影所有列col1,col2,col3,col7,col8等,但根據運行時@var的值,只需要一些列。這可能會導致執行不必要的聚簇索引查找的計劃,因爲非聚簇索引不包含SELECT投影的所有列。

另一方面,3個單獨的SELECTS,每個只投影所需的列可能受益於非聚集索引,它們只覆蓋每種情況下的投影列。

當然這取決於你的數據模型和精確查詢的實際模式,但這只是擡起頭,所以你不要把過程式編程的思想必須頭腦幀SQL的聲明性的世界。

22

您正在尋找CASE語句

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

示例從MSDN複製:

USE AdventureWorks; 
GO 
SELECT ProductNumber, Category = 
     CASE ProductLine 
     WHEN 'R' THEN 'Road' 
     WHEN 'M' THEN 'Mountain' 
     WHEN 'T' THEN 'Touring' 
     WHEN 'S' THEN 'Other sale items' 
     ELSE 'Not for sale' 
     END, 
    Name 
FROM Production.Product 
ORDER BY ProductNumber; 
GO 
+0

看起來我已經ninja'd! :) – 2009-07-13 23:01:03

+0

我仍然是一個n00b,所以我可以(很容易)是錯的,但我認爲這實際上並沒有回答這個問題,對吧? OP詢問他是如何選擇**多個**列的,而不是將數個選項中的一個選項分配給單列,看起來這個(和幾個答案)正在做。如果我是OP,那麼@JoelMansford的答案似乎是最正確的。請讓我知道如果我爲什麼我錯了! – dah97765 2013-10-01 19:40:09

9

試着這麼做

SELECT 
    CASE var 
     WHEN xyz THEN col1 
     WHEN zyx THEN col2 
     ELSE col7 
    END AS col1, 
    ... 

換句話說,使用條件表達式選擇該值,然後重命名該列。

或者,你可以建立一些動態SQL hack共享查詢尾;我之前用iBatis做過這個。

0

CASE就是答案,但是您需要爲每個要返回的列創建一個單獨的case語句。只要WHERE子句是相同的,分隔成多個查詢就沒有太大的好處。

例子:

SELECT 
    CASE @var 
     WHEN 'xyz' THEN col1 
     WHEN 'zyx' THEN col2 
     ELSE col7 
    END, 
    CASE @var 
     WHEN 'xyz' THEN col2 
     WHEN 'zyx' THEN col3 
     ELSE col8 
    END 
FROM Table 
... 
0

最明顯的解決方案已經上市。根據查詢的位置(即在應用程序代碼中),不能總是使用IF語句,並且內聯CASE語句可能在許多列成爲條件時變得痛苦。 假設Col1中+ COL3 + COL7屬於同一類型,同樣col2的,COL4 + Col8你可以這樣做:

SELECT Col1, Col2 FROM tbl WHERE @Var LIKE 'xyz' 
UNION ALL 
SELECT Col3, Col4 FROM tbl WHERE @Var LIKE 'zyx' 
UNION ALL 
SELECT Col7, Col8 FROM tbl WHERE @Var NOT LIKE 'xyz' AND @Var NOT LIKE 'zyx' 

由於這是一個命令有關於幾個性能優勢計劃緩存。此外,查詢優化器將快速消除@Var不匹配適當值而不觸及存儲引擎的那些語句。

2

簡單的CASE表達式:

CASE input_expression 
    WHEN when_expression THEN result_expression [ ...n ] 
    [ ELSE else_result_expression ] 
END 

搜索CASE表達式:

CASE 
    WHEN Boolean_expression THEN result_expression [ ...n ] 
    [ ELSE else_result_expression ] 
END 

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