Desidero selezionare una concatenazione di un paio di campi, ma con un separatore tra di essi. Il separatore dovrebbe essere presente solo se entrambi gli operandi non sono nulli.Oracle: Concat con delimitatore, ma solo se entrambi gli operandi NON sono NULL
Quindi per un record con a='foo', b=NULL, c='bar'
, voglio ottenere il risultato abc='foo;bar'
(non 'foo;;bar'
).
Mi piacerebbe avere una funzione come concat_sep(a, b, ';')
che aggiunge solo ';' inbetween se sia a che b non sono nulli.
Naturalmente, posso usare NVL2 come questo:
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)
Ma, come si può vedere, il codice diventa Cloggy presto, soprattutto quando si ha più di 3 colonne e hai dato loro dei nomi sensati, invece di a, b e c. ;-)
Non sono riuscito a trovare un modo più breve, più facile o più leggibile, ma ho pensato di chiederlo prima di rinunciare del tutto (o perdere tempo a scrivere una tale funzione da solo).
sembra come molto specifica logica y vuoi: perché scrivere da solo la tua stessa funzione è una perdita di tempo? – tbone
Sarebbe se ce ne fosse già uno. :) – GolezTrol
senza 11g listagg sembra che avrai bisogno di scrivere il tuo. E guardando i tuoi commenti, sembra che tu abbia scritto il tuo, quindi sono confuso, stai cercando alcune funzionalità che la tua funzione non fornisce? Forse un esempio di caso d'uso per vedere come prevedi di usarlo (posso pensare ad alcuni approcci) – tbone