Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用coalesce-inside-case-then子查询获得逗号分隔的值_Sql_Sql Server 2012 - Fatal编程技术网

Sql 使用coalesce-inside-case-then子查询获得逗号分隔的值

Sql 使用coalesce-inside-case-then子查询获得逗号分隔的值,sql,sql-server-2012,Sql,Sql Server 2012,我想知道是否有人能帮我解决一个我已经陷入困境一段时间的问题。我有一个数据库,需要根据变量值从中获取一些数据,所以我尝试使用case语句来实现,但由于子查询返回了多行,所以我被卡住了。有人能帮我解决这个问题吗 这是我当前的查询: Select CASE @WorkTypeId WHEN 1 THEN (SELECT COALESCE(@GroupId+',' ,'') + CAST(GroupId as VARCHAR(2)) FROM UserGroupRoleMappin

我想知道是否有人能帮我解决一个我已经陷入困境一段时间的问题。我有一个数据库,需要根据变量值从中获取一些数据,所以我尝试使用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)
该查询用于获取链接用户的所有组。 与let类似,如果工作类型为1,并且用户id为567的用户与组id为1、3、5、4、6的某些组链接(对于每个不同的组,数据库中都有一个新条目),则我需要获取除“4”之外的所有组id,这些组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应该被忽略。

只有在需要返回列表中的第一个非空值时,才可以使用COALESCE()。例如:

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

返回“A”

您可以按照下面的方式编写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 

你能解释一下你想做什么吗?共享一些示例数据和预期结果将有助于使问题更加清晰。根据worktypeId,我需要使用if-else语句从dbby中获取一些组ID我能够实现,但我想按case语句执行相同的操作您的最后一个else语句与第一个case语句相同..我的子查询返回的值超过1行,因此我想在@groupId中选择该值,我可以使用coalesce在正常查询中执行该操作