使用合并内的大小写,然后子查询以逗号分隔的值

时间:2018-10-22 06:28:19

标签: sql sql-server-2012

我想知道是否有人可以帮助我解决一段时间以来遇到的问题。我有一个数据库,需要根据一些变量值从那里获取一些数据,因此我尝试使用case语句来完成此操作,但是由于子查询返回了多行,因此我被卡住了。谁能帮我解决问题

这是我当前的查询:

Select
   CASE @WorkTypeId
        WHEN 1 THEN (SELECT COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2)) FROM UserGroupRoleMapping
                WHERE UserId= @UserId and IsActive=1 AND GroupId != 4)
        WHEN 3 THEN (SELECT COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2)) FROM UserGroupRoleMapping
                WHERE UserId= @UserId and IsActive=1 AND GroupId = 4)        
        ELSE (SELECT COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2)) FROM UserGroupRoleMapping
                WHERE UserId= @UserId and IsActive=1)

该查询用于获取链接用户的所有组。 就像让,如果工作类型为1,用户ID为567的用户与ID为1、3、5、4、6的某些组链接(对于每个不同的组,数据库中都有一个新条目),那么我需要获取除以逗号分隔的“ 4”以外的所有组ID。

通过使用if else,我可以通过以下查询实现

IF  @WorkTypeId =1 
BEGIN
SELECT @GroupId = COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2))
FROM UserGroupRoleMapping
WHERE UserId= @UserId and IsActive=1 AND GroupId != 4
END

在这里,我可以在@GroupId变量中获取组ID

样本数据:

 UserId   GroupId  WorkTypeId  IsActive 
 567       1          1           1
 567       2          1           1
 567       3          1           1
 567       4          1           1
 567       5          2           1
 567       2          2           1
 567       4          3           1
 567       1          3           1

我应该得到的输出(用户ID:567)应该是: 当worktypeId = 1时  groupId:(1,2,3) 当worktypeId = 2时 groupId:(1,2,3,4,5) 当workTypeId = 3时 groupId:(4) IsActive应该忽略。

2 个答案:

答案 0 :(得分:0)

仅当需要返回列表中的第一个非空值时,才可以使用COALESCE()。 EG:

SELECT COALESCE(NULL, NULL, NULL, 'A', NULL, 'B');

返回“ A”

答案 1 :(得分:0)

您可以通过以下方式编写case语句,并且可以避免子查询

 SELECT        case when @WorkTypeId = 1 and GroupId != 4 then
               COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2))
               case when @WorkTypeId = 3 and GroupId = 4 then
               COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2))
               else COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2))
               as GroupId
               FROM UserGroupRoleMapping
               WHERE UserId= @UserId
               and IsActive=1