2017-12-27 366 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