Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle :Concat avec délimiteur, mais uniquement si les deux opérandes ne sont PAS NULL

Je sais que vous utilisez 10g, donc cela ne fonctionnera pas. Mais pour être complet, LISTAGG() gère NULL valeurs "correctement". Pour cela, vous devrez cependant mettre à jour vers 11g2 :

-- Some sample data, roughly equivalent to yours
with t as (
  select 'foo' as x from dual union all
  select null       from dual union all
  select 'bar'      from dual
)
-- Use the listagg aggregate function to join all values
select listagg(x, ';') within group (order by rownum)
from t;

Ou un peu plus succinct, si vous souhaitez lister les colonnes d'une table :

-- I use SYS.ORA_MINING_VARCHAR2_NT as a TABLE TYPE. Use your own, if you prefer
select listagg(column_value, ';') within group (order by rownum)
from table(ORA_MINING_VARCHAR2_NT('foo', null, 'bar'));

Ou contre une table réelle :

select listagg(column_value, ';') 
       within group (order by rownum)
from Table1
cross join table(ORA_MINING_VARCHAR2_NT(Table1.a, Table1.b, Table1.c))
group by Table1.id;

Maintenant, je ne sais pas si c'est tellement mieux (plus lisible) que votre exemple d'origine :-)