Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:Concat com delimitador, mas apenas se ambos os operandos forem NOT NULL


Eu sei que você está usando 10g, então isso não vai funcionar. Mas para completar, LISTAGG() manipula NULL valores "corretamente". Para isso, você teria que atualizar para 11g2, no entanto:
-- 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 um pouco mais sucinto, se você quiser listar colunas de uma tabela:
-- 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 contra uma tabela real:
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;

Agora não tenho certeza se isso é muito melhor (mais legível) do que o seu exemplo original :-)