2015-08-14 5 views
2

Я хочу объединить значение столбца таблицы SQL Server в параметре Varchar. Для этого я использую функцию COALESCE. Но когда я использую его с заявлением Select с предложением Where, я думаю, что он не принимает условия условий предложения.Функция SQL Server COALESCE с предложением WHERE

SELECT 
    @UserIds = COALESCE(@UserIds,'') + CONVERT(VARCHAR(MAX), UserID) +','  
FROM vw_Users    
WHERE GroupID = @GroupID           
    AND ISNULL(Active_yn, 'Y') = 'Y'    
    AND ISNULL(Delete_YN, 'N') = 'N' 

Так может ли кто-нибудь помочь мне в этом?

+0

Что этот код делать? Что вы ** ожидаете ** это делать? –

+0

он должен выбрать все идентификаторы пользователя из связанной таблицы в строку, разделенную запятой. –

+0

И что ** это делает ** ?? –

ответ

0

Если corecctly понял вашу проблему, вы можете использовать CASE что-то вроде:

SELECT 
    CASE WHEN ISNULL(Active_yn, 'Y') = 'Y' 
       AND ISNULL(Delete_YN, 'N') = 'N' 
       AND GroupID = @GroupID THEN @UserIds = COALESCE(@UserIds,'') + CONVERT(VARCHAR(MAX), UserID) +',' 
     ELSE Condition 
    END  
FROM vw_Users    

В этом случае он будет конкатенировать только тогда, когда все условия отвечают, в противном случае вы можете передать условие ELSE.

0

Ваш запрос выглядит хорошо, где условия правильные, просто небольшое изменение функции COALESCE для объединения «,» только при необходимости. Вот пример с данным:

DECLARE @UserIds VARCHAR(100); 
DECLARE @GroupID INT = 1; 

WITH vw_Users (UserID, GroupID, Active_YN, Delete_YN) AS (
    SELECT 1, 1, 'Y', 'N' UNION ALL -- valid value 
    SELECT 2, 1, 'Y', 'N' UNION ALL -- valid value 

    SELECT 3, 1, 'N', 'N' UNION ALL -- invalid value because Active_YN <> 'Y' 
    SELECT 4, 1, 'Y', 'Y' UNION ALL -- invalid value because Deleted_YN <> 'N' 
    SELECT 5, 2, 'Y', 'N'   -- invalid value because GroupID <> 1 
) 
SELECT 
    @UserIds = COALESCE(@UserIds + ',','') + CONVERT(VARCHAR(MAX), UserID) 
FROM vw_Users    
WHERE GroupID = @GroupID           
    AND ISNULL(Active_yn, 'Y') = 'Y'    
    AND ISNULL(Delete_YN, 'N') = 'N' 

SELECT @UserIds --> 1,2 
0

Вы должны попытаться следующее,

Declare @cols nvarchar(max) = '' 
SELECT @cols = 
STUFF((SELECT DISTINCT TOP 100 PERCENT 
     ',' + CONVERT(VARCHAR(10), t2.UserID) 
     FROM vw_Users AS t2 
     WHERE GroupID = @GroupID           
     AND ISNULL(Active_yn, 'Y') = 'Y'    
     AND ISNULL(Delete_YN, 'N') = 'N' 
     FOR XML PATH('') 
), 1, 1, '') 

select @cols 

Здесь вы Sql fiddle

+0

Я попытался с этим, но выход не содержал условий. –

+0

дайте мне скрипку, если у вас есть или дайте мне образцы данных, я могу помочь вам лучше. –

Смежные вопросы