将基于特定条件的额外列附加到结果查询

时间:2017-04-18 19:41:48

标签: sql sql-server

我目前根据以下查询生成了四列:

SELECT DISTINCT Client, Name, Email
FROM Login_Requests AS extR
INNER JOIN Login_Clients AS extC
    ON lower(extC.Name) = lower(extR.Client)
INNER JOIN Login_EmailDomains AS extED
    ON extED.ClientID = extC.ClientID
INNER JOIN Login_Admins AS extU
    ON extU.GroupID = extED.GroupID
WHERE extR.ReqStatusID = 2 AND extU.GroupID = 2;

结果如下:

Client      Name         Email
-------     -----        ------
Google      Jon Snow     snowj@google.com
Google      Ned Stark    starkn@google.com
Apple       Bat Man      manb@apple.com
Apple       Cat Woman    womanc@apple.com
Microsoft   Bill Gates   gatesb@microsoft.com

但是,我想从Login_Admins表中获取管理员,并将其作为最后一列添加到结果查询中,如下所示:

Client      Name         Email                   Admin
-------     -----        ------                  ------
Google      Jon Snow     snowj@google.com        adminthefirst@shujin.com
Google      Ned Stark    starkn@google.com       adminthefirst@shujin.com
Apple       Bat Man      manb@apple.com          adminthesecond@shujin.com
Apple       Cat Woman    womanc@apple.com        adminthesecond@shujin.com
Microsoft   Bill Gates   gatesb@microsoft.com    adminthethird@shujin.com, adminthefourth@shujin.com
像这样。基本上,可以将一个或甚至两个管理员分配给一个客户端。我目前在编写逻辑时难以在结果集的末尾附加该admin列。我最初尝试的可能是创建一个像这样的子查询:

SELECT COALESCE((SELECT Login_Admins.Email
             FROM Login_Admins
             WHERE UserTypeID = 2 AND extED.GroupID = 2), ',', '')

只是在SELECT语句的末尾添加它,但最终没有对我有利。 我正在做什么甚至是可能的,因为我对如何做到这一点感到茫然。

2 个答案:

答案 0 :(得分:1)

使用CASE表达式以及SELECT列表中的其他列,如

SELECT DISTINCT Client, Name, Email,
case when Login_Admins.UserTypeID = 2 AND extED.GroupID = 2 
then Login_Admins.Email else null end as Admin_Email

答案 1 :(得分:1)

如前所述,您需要使用FOR XML在一行中获取所有内容。如果没有任何内容,AdminEmails将返回NULL,即使有一个CROSS APPLY,所以如果不可能,你可能需要处理它:

SELECT Client, Name, Email, adm.Admin
FROM Login_Requests AS extR
INNER JOIN Login_Clients AS extC
    ON lower(extC.Name) = lower(extR.Client)
INNER JOIN Login_EmailDomains AS extED
    ON extED.ClientID = extC.ClientID
CROSS APPLY
(   
        SELECT STUFF((SELECT CONCAT(', ', extU.Email) 
        FROM Login_Admins AS extU
        WHERE extU.GroupID = extED.GroupID
        FOR XML PATH('')), 1, 2, '') AS Admin
) AS adm
相关问题