Tôi biết bạn đang sử dụng 10g, vì vậy điều đó sẽ không hiệu quả. Nhưng để đầy đủ, hãy LISTAGG()
xử lý NULL
các giá trị "chính xác". Tuy nhiên, đối với điều đó, bạn phải cập nhật lên 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;
Hoặc ngắn gọn hơn một chút, nếu bạn muốn liệt kê các cột từ một bảng:
-- 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'));
Hoặc so với một bảng thực tế:
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;
Bây giờ tôi không chắc liệu điều này có tốt hơn nhiều (dễ đọc hơn) so với ví dụ ban đầu của bạn hay không :-)