SQL Server:CASE和连接字符串

时间:2017-12-27 19:52:54

标签: sql-server tsql sql-server-2012

我想知道如何从多个SQL 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

因此,我想引入一个名为Access Level的新列,而不是两列B和LK,如果B为Active或LK处于活动状态,则根据每个程序添加B或LK。例如,如果B仅处于活动状态,则“访问级别”列的输出将为B,如果两个程序都处于活动状态,则输出将为“B,LK”,如果LK仅处于活动状态,则列将具有LK的vakue。 / p>

我可以选择连接多个案例查询的列值吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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表达式按从上到下的顺序计算并解析为满足的第一个WHEN条件,因此如果B和LK都处于活动状态,则将满足第一个条件,将返回第一个结果,并且无关紧要,其他两个条件也都是正确的。