используя coalesce внутри case, затем подзапрос, чтобы получить значения, разделенные запятыми - PullRequest
0 голосов
/ 22 октября 2018

Мне интересно, может ли кто-нибудь помочь мне с проблемой, над которой я застрял некоторое время.У меня есть база данных, из которой мне нужно получить данные в зависимости от значения переменной, поэтому я попытался сделать это с помощью оператора 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 и пользователь с идентификатором пользователя 567 связан с некоторыми группами с идентификатором группы 1,3,5,4,6 (для каждой отдельной группы есть новая запись в базе данных), то мне нужно получитьвсе идентификаторы группы, кроме '4', которые связаны с этой запятой, разделенной пользователем.

BY, используя, если еще я могу добиться этого с помощью следующего запроса

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

Пример данных:

 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

вывод, который я должен получить (идентификатор пользователя: 567), должен быть: когда worktypeId = 1 groupId: (1,2,3) когда worktypeId = 2 groupId: (1,2,3,4,5) когда workTypeId = 3 groupId: (4) IsActive следует игнорировать.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы можете написать свое заявление ниже и можете избежать подзапроса

 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 
0 голосов
/ 22 октября 2018

Вы можете использовать COALESCE (), только если вам нужно вернуть первое ненулевое значение в списке.EG:

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

возвращает 'A'

...