Как вернуть пустую или нулевую запись при использовании STUFF и XML PATH на SQL Server 2016?

Я использую STUFF и XML PATH, так как я обязательно использую SQL Server 2016. Я работал над этим запросом и не могу понять, как вернуть пустую или пустую запись при использовании STUFF и XML PATH. Ниже приведен фрагмент запроса.

SELECT 
    Names = STUFF((SELECT '; ' + CONCAT(t3.FirstName, ' ', t3.LastName)
                   FROM table1 t1
                   LEFT JOIN table2 t2 ON t0.columnID = t2.columnID
                   LEFT JOIN table3 t3 ON t3.columnID = t3.columnID
                   FOR XML PATH('')), 1, 1,''),

Проблема в том, что при отсутствии фамилии / имени этот запрос возвращает разделители '; ; ' но мне нужно, чтобы он возвращал пустое значение, если нет фамилии / имени.


person Yashi Vaidehi Arya    schedule 15.01.2021    source источник
comment
Пожалуйста, предоставьте образцы данных и желаемые результаты. Чего вы хотите достичь, довольно неясно.   -  person Gordon Linoff    schedule 15.01.2021
comment
Просто используйте CASE, чтобы вместо SELECT '; ' + CONCAT(t3.FirstName, ' ', t3.LastName) сделать SELECT CASE WHEN ISNULL(t3.FirstName, '') = '' AND ISNULL(t3.LastName, '') = '' THEN '' ELSE '; ' + CONCAT(t3.FirstName, ' ', t3.LastName) END   -  person Ryan Wilson    schedule 15.01.2021
comment
'; ;'? Так вы работаете с SET CONCAT_NULL_YIELDS_NULL OFF? Имейте в виду, что параметр OFF устарел, он использовался в течение многих лет и будет эффективно удален в будущей версии SQL Server. Рассмотрите возможность переключения кода, который вместо этого использует конструкции ISNULL и NULLIF.   -  person AlwaysLearning    schedule 16.01.2021


Ответы (1)


Просто добавьте WHERE:

WHERE t3.FirstName IS NOT NULL OR t3.LastName IS NOT NULL

В этом случае вы, вероятно, также захотите иметь дело с одним из них, равным нулю и получающим дополнительное пространство:

SELECT '; ' + CASE
    WHEN t3.FirstName IS NOT NULL AND t3.LastName IS NULL THEN t3.FirstName
    WHEN t3.LastName IS NOT NULL AND t3.FirstName IS NULL THEN t3.LastName
    ELSE CONCAT(t3.FirstName, ' ', t3.LastName) END

Кроме того, поскольку ваш разделитель состоит из двух символов, вам необходимо изменить параметры STUFF:
FOR XML PATH('')), 1, 2,'')

person Charlieface    schedule 16.01.2021