2017-08-24 198 views
1

包括全包容性的範疇。如果我有一個CASE表達式內容如下:使用CASE語句

CASE WHEN Category='A' THEN 'Discharged' 
    WHEN Category='B' THEN 'Not Discharged' 
    WHEN Category='A' OR Category='B' THEN 'Both' 
    END AS Status 

我注意到,CASE不顯示單獨的「兩個」狀態的記錄。它只顯示「已解除」或「未解除」。有沒有辦法讓CASE表達式包含單獨的'Both'結果以及每個'Discharged'或'Not Discharged'結果?

如果我在'Discharged'或'Not Discharged'之上編碼'Both'的條件,輸出結果會顯示所有記錄的'Both'。我相信這與CASE的順序邏輯是一致的。

+0

你能否提供一些樣本數據?你也可以發佈整個查詢嗎? –

+0

你想用這個做什麼,類別只能落入A和B?如果是這樣的話,爲什麼不打印每個記錄的'兩個'除了放電/不放電? –

+0

此狀態字段實際上被饋入BI工具以用作過濾器。 'Both'狀態可以讓我顯示所有結果,而不必選擇「已排出」和「未排出」之一。 – AS91

回答

1

CASE表達式按代碼中的「外觀」順序進行評估並短路。在你的情況下,將最後的WHEN移到第一個位置。

CASE表達式使用布爾比較而不是按位。如果您的條件匹配的非這是一個好主意,有一個ELSE狀況,以及避免NULL返回:

CASE 
    WHEN Category='A' AND Category='B' THEN 'Both' 
    WHEN Category='A' THEN 'Discharged' 
    WHEN Category='B' THEN 'Not Discharged' 
END AS Status 

有關按位比較試試這個:

DECLARE @Category INT = ASCII('A')|ASCII('B') 
SELECT 
    CASE 
     WHEN @Category = (ASCII('A')|ASCII('B')) THEN 'Both' 
     WHEN @Category= ASCII('A') THEN 'Discharged' 
     WHEN @Category= ASCII('B') THEN 'Not Discharged' 
    END AS Status 

注意。

參見位運算符和用途的完整列表:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql

如果你想通過表達式過濾也就是說,它出現在WHERE子句中,那麼你需要不同的看法寫:

DECLARE @SearchCriteria VARCHAR(50) 
SET @SearchCriteria = 'Both' 
SELECT Category 
FROM (VALUES('A'), ('B')) AS a(Category) 
WHERE 
    Category = (CASE @SearchCriteria 
     WHEN 'Discharged' THEN 'A' 
     WHEN 'Not Discharged' THEN 'B' 
     WHEN 'Both' THEN Category 
    END) 
+0

並且不起作用,因爲行級上的類別不能同時爲A和B.雙方的想法是它是包容性的。並不是說它可以同時出院和不出院。這是一個顯示狀態爲'Both'的冗餘行,因此當我在Both上過濾時,我基本上可以獲得每個狀態。 2在這種情況下。包括ELSE +1,但我沒有在這裏讓事情變得更簡單。 – AS91

+0

@ AS91 - 希望第三種選擇是你需要的 – Alex

1

你可以使用UNION

SELECT person_id, 
     ... 
     CASE WHEN Category='A' THEN 'Discharged' 
      WHEN Category='B' THEN 'Not Discharged' 
     END AS Status 
    FROM table 
UNION 
SELECT person_id, 
     ... 
     'Both' AS Status 
    FROM table