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

У меня есть такой запрос:

select stuff (
        (select '; ' + isnull(org.Number, '-')
        from Organization org
        for xml path('')), 1, 2, ''
       )

Мне нужно вернуть строку со всеми значениями, включая нули, так что ее количество значений равно количеству организаций, но если ВСЕ значения являются пустыми или нулевыми, мне нужно вернуть пустую строку или ноль (не имеет значения).

Первой мыслью было использовать регулярное выражение и проверить, есть ли цифры в возвращаемом запросе. но это не так просто в использовании. Есть ли другие варианты, чтобы решить это?

Например, если таблица Organization содержит

ID | Number
1  | 123456
2  | null
3  | 3232

тогда приведенная строка должна быть '123456; -; 3232'

если таблица Организация содержит

ID | Number
1  | null
2  | null
3  | null

приведенная строка должна быть null

1 ответ

Решение

Вот один из способов

select
    iif(patindex('%[0-9]%', res) = 0, null, res)
from
    (select res = stuff((
        select
            '; ' + isnull(cast(number as varchar(200)), '-')
        from 
            Organization
        order by id
        for xml path('')
    ), 1, 2, '')
) t
Другие вопросы по тегам