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).

questionAnswers(2)

yourAnswerToTheQuestion