2016-12-05 94 views
0

Employee表中有一些EmployeeType,但被歸類爲'Internal'或'External'。外部類型進一步分爲「合同」或「外包」。我正在編寫一個proc,在其中我收到一個參數爲@EmployeeType。我期待參數值中有'內部'或'外部'或'ALL'。SQL where子句具有多個THEN的CASE開關

這裏是我的查詢

SELECT * FROM EMPLOYEE WHERE EmploymentType = CASE WHEN @EmployeeType = 'Internal' WHEN @EmployeeType = 'External' THEN 'Contract' OR 'Outsource' ELSE EmployeeType END 

表中的可用EmployeeTypes - 內部,外部合同,外包

搜索網絡上有很多後,我找不到正確的語法來獲得期望的輸出。任何人都可以請幫忙。

我知道它是一個糟糕的設計,但它是一個遺留系統,沒什麼我可以用它做的。

+0

你覺得我在這裏失去了一些東西?如果它是「全部」,那很簡單。如果它是'External',則需要任何「Contract」或「Outsource」。但是,如果它是「內部」,你想申請什麼? – MatBailie

+0

如果它的'內部'我想內部本身。 –

回答

0

你也可以試試這個:

DECLARE @EmployeeType VARCHAR(100)='Internal' 
    ;WITH EMPLOYEE(ID,EmploymentType)AS 
    (
     SELECT 1,'Internal' UNION 
     SELECT 2,'Contract' UNION 
     SELECT 3,'Outsource' 
    ) 
    SELECT * FROM EMPLOYEE 
    WHERE EmploymentType IN (CASE @EmployeeType WHEN 'External' THEN 'Contract' WHEN 'Internal' THEN @EmployeeType ELSE EmploymentType END 
          ,CASE WHEN @EmployeeType = 'External' THEN 'Outsource' ELSE NULL END) 

--Internal ----

 
ID   EmploymentType 
----------- -------------- 
1   Internal 

------外部------- ---

 
ID   EmploymentType 
----------- -------------- 
2   Contract 
3   Outsource 

----- ALL ----

 
ID   EmploymentType 
----------- -------------- 
1   Internal 
2   Contract 
3   Outsource 

+0

謝謝@Nolan,我在最後2行中使用了你的想法,沒有CTE。它的工作原理並沒有性能問題:) –

3

我甚至不會用CASE聲明...

WHERE 
     (@EmployeeType = 'All') 
    OR (@EmployeeType = 'Internal' AND EmploymentType = 'Internal') 
    OR (@EmployeeType = 'External' AND EmploymentType IN ('External', 'Outsource', 'Contract')) 

編輯:

這就是說,無論你如何實現這一點,你可能不會得到很好的執行計劃。這是深入的,但推理是在這裏:http://www.sommarskog.se/dyn-search.html

TL;DR - 這將是更高性能使用Multiple different queries inside IF blocksDynamic SQL

編輯:

如果你想用一個CASE語句來做到這一點,或者它是一個學術活動中如何型的東西應措辭......

在SQL服務器,CASE語句只能返回一個標量值。它不能返回一個列表,甚至不能返回布爾結果。這迫使你使用嵌套條件。

WHERE 
    CASE @EmployeeType 
    WHEN 'All' 
     THEN 1 
    WHEN 'Internal' 
     THEN CASE WHEN EmploymentType = 'Internal' THEN 1 END 
    WHEN 'External' 
     THEN CASE WHEN EmploymentType IN ('External', 'Outsource', 'Contract') THEN 1 END 
    END 
    = 
    1 

這不是很漂亮。

另一種選擇是使用可以返回一組值來比較的子查詢。

WHERE 
    EmploymentType IN (
     (
      SELECT 'Internal' AS type WHERE @EmployeeType IN ('All', 'Internal') 
      UNION ALL 
      SELECT 'External' AS type WHERE @EmployeeType IN ('All', 'External') 
      UNION ALL 
      SELECT 'Contract' AS type WHERE @EmployeeType IN ('All', 'External') 
      UNION ALL 
      SELECT 'Outsource' AS type WHERE @EmployeeType IN ('All', 'External') 
     ) 
    ) 
0

你想要做的任何事情「內部」和「全部」如果沒有的話只是一個if語句應該足夠了如下 IF(@EmployeeType =「外部」) BEGIN //寫你的邏輯這裏。

END