Oracle: Połącz z ogranicznikiem, ale tylko wtedy, gdy oba operandy NIE są NULL
Chcę wybrać konkatenację kilku pól, ale z separatorem między nimi. Separator powinien być tylko wtedy, gdy oba operandy nie są puste.
Więc dla nagrania za='foo', b=NULL, c='bar'
, Chcę uzyskać wynikabc='foo;bar'
(nie'foo;;bar'
).
Chciałbym mieć taką funkcjęconcat_sep(a, b, ';')
to dodaje tylko „;” między nimi, jeśli a i b nie są puste.
Oczywiście mogę użyć nvl2 w ten sposób:
select
a, b, c,
substr(abc, 1, length(abc) - 1) as abc
from
(select
a, b, c,
nvl2(a, a || ';', '') || nvl2(b, b || ';', '') || nvl2(c, c || ';', '') as abc
from
Table1)
Ale, jak widzisz, kod ten staje się wkrótce zapchany, zwłaszcza gdy masz więcej niż 3 kolumny i podałeś im sensowne nazwy zamiast a, b i c. ;-)
Nie mogłem znaleźć krótszego, łatwiejszego lub bardziej czytelnego sposobu, ale pomyślałem, że zapytam tutaj, zanim całkowicie zrezygnuję (lub zmarnuję czas na samodzielne pisanie takiej funkcji).