Oracle: Concat com delimitador, mas somente se ambos os operandos forem NOT NULL

Eu quero selecionar uma concatenação de um par de campos, mas com um separador entre eles. O separador só deve estar lá se os dois operandos não forem nulos.

Então, para um registro coma='foo', b=NULL, c='bar', Eu quero pegar o resultadoabc='foo;bar' (não'foo;;bar').

Eu gostaria de ter uma função comoconcat_sep(a, b, ';') que adiciona apenas o ';' entre se tanto a como b não são nulos.

Claro, eu posso usar o nvl2 assim:

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)

Mas como você pode ver, esse código se torna entupido em breve, especialmente quando você tem mais de três colunas e dá nomes sensatos ao invés de a, b e c. ;-)

Não consegui encontrar um caminho mais curto, mais fácil ou mais legível, mas pensei em perguntar aqui antes de desistir inteiramente (ou perder tempo escrevendo uma função dessas).

questionAnswers(2)

yourAnswerToTheQuestion