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. Para obtener un registro con a='foo', b=NULL, c='bar'
, quiero obtener el resultado abc='foo;bar'
(no).Oracle: Concat con delimitador, pero solo si ambos operandos NO SON NULOS
Me gustaría tener una función como concat_sep(a, b, ';')
que solo agrega el ';' entremedio si tanto a como 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 se puede ver, este código se convierte en cloggy pronto, sobre todo cuando se tiene más de 3 columnas y se les ha dado nombres sensibles vez de a, by c. ;-)
No pude encontrar una manera más corta, más fácil o más fácil de leer, pero pensé en preguntar aquí antes de renunciar por completo (o perder el tiempo escribiendo esa función yo mismo).
parece como muy específica y lógica o quieres: ¿por qué escribir tu propia función sería una pérdida de tiempo? – tbone
Sería si ya hubiera uno. :) – GolezTrol
sin 11g listagg parece que tendrá que escribir el suyo. Y al mirar tus comentarios, parece que tu escribiste el tuyo, así que estoy confundido, ¿estás buscando alguna funcionalidad que tu propia función no brinde? Tal vez un ejemplo de caso de uso para ver cómo planeas usar esto (puedo pensar en algunos enfoques) – tbone