Oracle: Concat mit Trennzeichen, aber nur, wenn beide Operanden NICHT NULL ist

Möchte ich wählen Sie eine Verkettung von ein paar Felder, aber mit einem separator zwischen Ihnen. Der separator sollte nur da sein, wenn beide Operanden nicht null ist.

Also für einen Datensatz mit a='foo', b=NULL, c='bar' möchte ich, um das Ergebnis abc='foo;bar' (nicht 'foo;;bar').

Ich würde gerne eine Funktion haben wie concat_sep(a, b, ';') dass nur noch das ';' dazwischen, wenn a und b beide nicht null sind.

Natürlich kann ich verwenden nvl2 wie diese:

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 cloggy bald, vor allem, wenn Sie mehr als 3 Spalten und Sie Ihnen sinnvolle Namen anstelle von a, b und c aus. 😉

Ich konnte nicht finden einen kürzer, einfacher und lesbarer Weise, aber ich dachte, ich würde hier Fragen, bevor er sich ganz (oder verschwenden Zeit mit dem schreiben so eine Funktion selbst).

  • scheint, wie sehr die spezifische Logik, die Sie möchten: warum schreiben Sie Ihre eigene Funktion selbst eine Verschwendung von Zeit?
  • Es wäre, wenn es sich herausstellte, schon ein. 🙂
  • ohne 11g listagg sieht aus wie Sie benötigen, um Ihre eigenen schreiben. Und schaut auf Eure Kommentare, es scheint, Sie HABEN Ihr eigenes schreiben, also bin ich verwirrt, sind Sie auf der Suche nach einigen Funktionen, die Ihre eigene Funktion nicht bieten? Vielleicht ein use-case-Beispiel zu sehen, wie Sie planen, diese zu verwenden, (ich kann mir denken, ein paar Ansätze)
  • Ich weiß nicht wirklich brauchen, LISTAGG, ich brauche eine Funktion CONCAT, die mir erlaubt, zu spezifizieren, einen separator festzulegen, der zwischen zwei (oder mehr) nicht-null-Werte. @LukasEder vorgeschlagen LISTAGG als eine mögliche Lösung, das ist eine ziemlich komplexe Frage, da mein use-case. Also ich habe meine LISTAGG Ersatz, aber es ist nicht das, was ich jetzt brauche.
InformationsquelleAutor GolezTrol | 2012-07-12
Schreibe einen Kommentar