Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:Concat con delimitatore, ma solo se entrambi gli operandi NON sono NULL

So che stai usando 10 g, quindi non funzionerà. Ma per completezza, LISTAGG() gestisce NULL valori "correttamente". Per questo dovresti aggiornare a 11g2, però:

-- 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;

O un po' più conciso, se vuoi elencare le colonne da una tabella:

-- 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'));

O contro un tavolo reale:

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;

Ora non sono sicuro che sia molto meglio (più leggibile) del tuo esempio originale :-)