我想知道是否有人可以帮助我解决一段时间以来遇到的问题。我有一个数据库,需要根据一些变量值从那里获取一些数据,因此我尝试使用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应该忽略。
答案 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