Oracle: Concat avec séparateur, mais seulement si les deux opérandes ne sont PAS NULL

Je veux sélectionner une concaténation d'un couple de champs, mais avec un séparateur entre eux. Le séparateur doit uniquement si les deux opérandes ne sont pas null.

Donc, pour un enregistrement avec a='foo', b=NULL, c='bar', je veux obtenir le résultat abc='foo;bar' (pas 'foo;;bar').

Je voudrais avoir une fonction comme concat_sep(a, b, ';') qui n'ajoute le ';' dans l'intervalle, si a et b sont non nuls.

Bien sûr, je peux utiliser nvl2 comme ceci:

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)

Mais comme vous pouvez le voir, ce code devient cloggy tôt, surtout quand vous avez obtenu plus de 3 colonnes et vous leur avez donné sensible des noms au lieu de a, b et c. 😉

Je ne pouvais pas trouver un plus court, plus facile et plus lisible, mais j'ai pensé que je voudrais vous demander ici avant d'abandonner entièrement (ou perdre du temps à écrire une telle fonction moi-même).

semble très logique spécifique que vous souhaitez: pourquoi écrire votre propre fonction de vous-même être une perte de temps?
Il serait si il s'est avéré être déjà un. 🙂
sans 11g listagg ressemble, vous devez écrire votre propre. Et en regardant vos commentaires, il semble que vous N'écrivez votre propre, donc je suis confus, vous êtes à la recherche pour certaines fonctionnalités de votre propre fonction ne fournit pas? Peut-être un cas d'utilisation exemple pour voir comment vous prévoyez de l'utiliser (je ne peux penser à quelques approches)
Je n'ai pas vraiment besoin LISTAGG, j'ai besoin d'une fonction CONCAT qui me permet de spécifier un séparateur entre deux (ou plus) les valeurs non null. @LukasEder suggéré LISTAGG comme une solution possible, ce qui est assez complexe, étant donné mon cas d'utilisation. J'ai donc mon LISTAGG de remplacement, mais ce n'est pas ce dont j'ai besoin maintenant.

OriginalL'auteur GolezTrol | 2012-07-12