как вернуть null при select string_agg(concat_ws(),'; ')

Concat_ws() и Concat() в случаях когда все значения NULL возвращают пустую строку '' размером varchar(1) а не null Если поверх конкатинации запустить string_agg('; ', @a) то вместо пустой строки или null вернётся '; ''

declare @a varchar(10) = null
declare @b varchar(10) = null

select concat_ws('; ', @a , @b) as a

select
string_agg(a, ';') as agg
from(
select concat_ws('; ', cast(@a as varchar(max)),cast( @b as varchar(max))) as a
union all
select concat_ws('; ', cast(@a as varchar(max)),cast( @b as varchar(max))) as a
) as main

каким образом без сильной потери в производительности можно заменить пустую строку при конкатинации на null

пытался решить условием IIF(,,)

select
string_agg(
iif(concat_ws('; ', cast(a as varchar(max)),cast(b as varchar(max))) <> ''
,concat_ws('; ', cast(a as varchar(max)),cast(b as varchar(max))) 
,null ), ';') as agg
from @tab

работает, и скорость обработки запроса заметно не провисает. Может быть есть способ выполнить этот запрос быстрее или сделать код короче?


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

MS SQL Server имеет функцию NULLIF() для этого.

SQL

DECLARE @a VARCHAR(10) = null
    , @b VARCHAR(10) = null;

SELECT CONCAT_WS('; ', @a , @b) as a
    , NULLIF(CONCAT_WS('; ', @a , @b),'') AS Result;

Результат

+---+--------+
| a | Result |
+---+--------+
|   | NULL   |
+---+--------+
→ Ссылка