Ich möchte eine Verkettung von ein paar Feldern, aber mit einem Trennzeichen zwischen ihnen auswählen. Das Trennzeichen sollte nur vorhanden sein, wenn beide Operanden nicht null sind.Oracle: Concat mit Delimiter, aber nur, wenn beide Operanden NICHT NULL sind
Also für einen Datensatz mit a='foo', b=NULL, c='bar'
, möchte ich das Ergebnis abc='foo;bar'
(nicht 'foo;;bar'
) bekommen.
Ich möchte eine Funktion wie concat_sep(a, b, ';')
haben, die nur das ';' dazwischen, wenn sowohl a als auch b nicht null sind.
Natürlich kann ich NVL2 wie folgt verwenden:
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)
Aber wie Sie sehen können, dieser Code wird bald cloggy, vor allem, wenn Sie mehr als 3 Spalten bekam, und Sie haben sie vernünftige Namen statt gegeben von a, b und c. ;-)
Ich konnte keinen kürzeren, einfacheren oder lesbareren Weg finden, aber ich dachte, ich würde hier fragen, bevor ich ganz aufhöre (oder Zeit verschwenden, eine solche Funktion selbst zu schreiben).
wie sehr spezifische Logik y scheint ou wollen: warum wäre es eine Zeitverschwendung, selbst zu schreiben? – tbone
Es wäre, wenn es sich bereits herausstellte. :) – GolezTrol
ohne 11g listagg sieht aus wie Sie müssen Ihre eigenen schreiben. Und wenn Sie Ihre Kommentare betrachten, scheint es, dass Sie Ihre eigenen geschrieben haben, also bin ich verwirrt, suchen Sie nach einer Funktionalität, die Ihre eigene Funktion nicht bietet? Vielleicht ein Anwendungsfall Beispiel, um zu sehen, wie Sie dies verwenden möchten (ich denke an ein paar Ansätze) – tbone