Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Kết hợp với dấu phân cách, nhưng chỉ khi cả hai toán hạng KHÔNG ĐẦY ĐỦ

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 :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để viết một bảng theo nghĩa đen trong Oracle?

  2. Liệt kê tất cả các chức năng trong Cơ sở dữ liệu Oracle

  3. Hợp nhất CTE Oracle

  4. Làm thế nào để sắp xếp theo số đầu tiên với truy vấn SQL của Oracle?

  5. SQL để cập nhật mức lương của nhân viên với mức lương trung bình của bộ phận của họ