Может ли функция 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