2017-12-27 168 views
1

我想知道如何從多個SQL CASE表達式輸出連接字符串。SQL Server:CASE和連接字符串

這是我的查詢:

SELECT 
    u.UserId, 
    FirstName, 
    CASE u.access_b 
     WHEN '5000' THEN 'Active' 
     ELSE '' 
    END AS B, 
    CASE u.access_l 
     WHEN '2199-12-31' THEN 'Active' 
     ELSE '' 
    END AS LK 
FROM 
    Users u 
JOIN 
    userGroupMembership ugm ON u.userId = ugm.userId 
JOIN 
    usergroup ug ON ug.usergroupId = ugm.usergroupId 
WHERE 
    ug.usergroupId = 1220 
    AND (u.primaryType = 1 or u.primaryType = 2) 

我得到這個:

enter image description here

因此,而不是兩列B和LK,我想介紹一個新的列這將稱爲訪問級別,如果B是活動的或者LK是活動的,則根據每個程序添加B或LK。例如,如果僅B激活,則「訪問級別」列的輸出將爲B,如果兩個程序均處於活動狀態,則輸出爲「B,LK」,如果LK僅處於活動狀態,則列將具有LK的值。

我可以選擇連接多個案例查詢的列值嗎?

謝謝,Laziale

+0

如果我理解正確的話,我不認爲這是可能沒有一個子查詢。我假設你不想這樣,對吧? – stb

+0

只要我能夠以正確的方式獲得所需的數據,任何方法都可以工作。謝謝 – Laziale

回答

1

你可以做到這一點是:

SELECT T.*, 
     CASE WHEN B = 'Active' AND LK = 'Active' THEN 'B, LK' 
      WHEN B = 'Active' THEN 'B' 
      WHEN LK = 'Active' THEN 'LK' 
      ELSE '' 
      END AS [Access Level] 
FROM 
(
    SELECT u.UserId, 
      FirstName, 
      case u.access_b 
      When '5000' then 'Active' 
      Else '' 
      End as B, 
      case u.access_l 
      when '2199-12-31' then 'Active' 
      else '' 
      end as LK 
    FROM Users u 
    join userGroupMembership ugm ON u.userId = ugm.userId 
    join usergroup ug ON ug.usergroupId = ugm.usergroupId 
    WHERE ug.usergroupId = 1220 and (u.primaryType = 1 or u.primaryType = 2) 
) T 
0

收件,檢查你所描述的組合,並分配相應的值的第三CASE表達式。在僞代碼:

CASE 
    WHEN {B is active} AND {LK is active} THEN 'B, LK' 
    WHEN {B is active} THEN 'B' 
    WHEN {LK is active} THEN 'LK' 
    ELSE '' 
END 

CASE表達式,以便評估從頂部到底部,並且當其被滿足條件解析到第一,因此,如果B和LK是活動的,則所述第一條件將得到滿足,第一結果將被返回,而其他兩個條件也都是真的並不重要。

+0

我不認爲這會工作,我收到錯誤消息156,級別15,狀態1,行48 關鍵字'is'附近的語法不正確。 – Laziale

+0

這不是剪切和粘貼代碼,這是僞代碼。您需要用查詢中的實際代碼替換大括號中的部分。 –

+0

你能寫出實際的代碼嗎,我真的很感激。謝謝 – Laziale