Oracle: concat con delimitador, pero solo si ambos operandos NO son NULOS

Quiero seleccionar una concatenación de un par de campos, pero con un separador entre ellos. El separador solo debe estar allí si ambos operandos no son nulos.

Así que para un disco cona='foo', b=NULL, c='bar', Quiero conseguir el resultadoabc='foo;bar' (no'foo;;bar').

Me gustaría tener una función comoconcat_sep(a, b, ';') que solo agrega el ';' entre medio si a y b no son nulos.

Por supuesto, puedo usar nvl2 así:

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)

Pero como puede ver, este código pronto se atasca, especialmente cuando tiene más de 3 columnas y les ha dado nombres razonables en lugar de a, by c. ;-)

No pude encontrar una forma más corta, más fácil o más legible, pero pensé que lo pediría aquí antes de renunciar por completo (o perder el tiempo escribiendo esa función yo mismo).

Respuestas a la pregunta(2)

Su respuesta a la pregunta