Может ли функция STUFF возвращать значения NULL?

Я смотрю на следующую ссылку:

Можно ли разделить запятыми несколько строк в одном столбце?

Запрос, используемый в решении, является именно тем, что мне нужно, но также необходимо возвращать значения NULL.

SELECT t.TicketID,
   STUFF(ISNULL((SELECT ', ' + x.Person
            FROM @Tickets x
           WHERE x.TicketID = t.TicketID
        GROUP BY x.Person
         FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma]
FROM @Tickets t
GROUP BY t.TicketID

Это прекрасно работает, если с каждым [TicketID] связан [Персона].

Но если Person является NULL, для TicketID мне нужно вернуть только TicketID и сделать так, чтобы Person отображался как NULL или пустым. У меня проблемы с удалением ISNULL чисто.

Из этого:

[TicketID], [Person]
 T0001       Alice
 T0001       Bob
 T0002       Catherine
 T0002       Doug
 T0003       Elaine
 T0004       NULL

К этому:

[TicketID], [Person]
 T0001       Alice, Bob
 T0002       Catherine, Doug
 T0003       Elaine
 T0004       NULL

2 ответа

Это то, что вы хотите?

SELECT t.TicketID,
        STUFF((SELECT ', ' + COALESCE(t2.Person, '<NULL>')
               FROM @Tickets t2
               WHERE t2.TicketID = t.TicketID
               FOR XML PATH (''), TYPE
              ).value('.', 'VARCHAR(max)'
                     ), 1, 2, ''
             ) as Persons
FROM @Tickets t
GROUP BY t.TicketID;

GROUP BY в подзапросе нет необходимости, если у вас есть дубликаты.

Я не вижу твоей проблемы... Это должно работать " из коробки". Может я не понял проблемы...

  • удалил NOT NULL за Person
  • добавили еще одну строку с TicketID="T0004" и NULL как человек
  • удалил ISNULL из вашего запроса
  • упростили ваш код

Попробуй это:

DECLARE @Tickets TABLE (
    [TicketID] char(5) NOT NULL,
    [Person] nvarchar(15)  NULL
);

INSERT INTO @Tickets VALUES
    ('T0001', 'Alice'),
    ('T0001', 'Bob'),
    ('T0002', 'Catherine'),
    ('T0002', 'Doug'),
    ('T0003', 'Elaine'),
    ('T0004', NULL);

SELECT t.TicketID,
   STUFF(
           (
            SELECT ', ' + x.Person
            FROM @Tickets x
            WHERE x.TicketID = t.TicketID
            FOR XML PATH ('')
            ),1,2,'') AS [No Preceeding Comma]
FROM @Tickets t
GROUP BY t.TicketID;

Результат

TicketID   No Preceeding Comma
T0001      Alice, Bob
T0002      Catherine, Doug
T0003      Elaine
T0004      NULL
Другие вопросы по тегам