Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:Concat z ogranicznikiem, ale tylko wtedy, gdy oba operandy NIE są NULL

Wiem, że używasz 10g, więc to nie zadziała. Ale dla kompletności LISTAGG() obsługuje NULL wartości "prawidłowo". W tym celu musisz zaktualizować do 11g2, chociaż:

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

Lub nieco bardziej zwięzły, jeśli chcesz wyświetlić listę kolumn z tabeli:

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

Lub w stosunku do rzeczywistej tabeli:

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;

Teraz nie jestem pewien, czy to jest o wiele lepsze (bardziej czytelne) niż twój oryginalny przykład :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dlaczego tablica asocjacyjna indeksowana przez VARCHAR2 nie przechowuje więcej niż 9 elementów

  2. różnica kryteriów wyszukiwania między Like vs Contains() w Oracle

  3. Pobieranie określonych ciągów w ciągu za pomocą Oracle SQL

  4. Jak wstawić zestaw wyników zwrócony przez procedurę składowaną Oracle do innej tabeli przy użyciu drugiej procedury składowanej?

  5. Funkcje daty i godziny Oracle (pełna lista)