Saya tahu Anda menggunakan 10g, jadi itu tidak akan berhasil. Tapi untuk kelengkapan, LISTAGG()
menangani NULL
nilai "dengan benar". Untuk itu, Anda harus memperbarui ke 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;
Atau sedikit lebih ringkas, jika Anda ingin membuat daftar kolom dari tabel:
-- 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'));
Atau terhadap tabel yang sebenarnya:
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;
Sekarang saya tidak yakin apakah ini jauh lebih baik (lebih mudah dibaca) daripada contoh asli Anda :-)