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