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

Oracle SQL - câu lệnh trường hợp động

Bạn cần một hàm PIVOT với định nghĩa cột động. Cách đơn giản nhất là xoay xml:

create table tst_data (id int primary key, source varchar2(255));

insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');

commit;

select * from (
  select source from tst_data
) 
pivot xml 
(
  count(1)
  for source in (select distinct t.source from tst_data t)
)  

Sau khi bạn cần xử lý dữ liệu XML:

<PivotSet>
    <item>
        <column name = "SOURCE">COM</column>
        <column name = "COUNT(1)">1</column>
    </item>
    <item>
        <column name = "SOURCE">DEMO</column>
        <column name = "COUNT(1)">2</column>
    </item>
    <item>
        <column name = "SOURCE">INTERNET</column>
        <column name = "COUNT(1)">4</column>
    </item>
    <item>
        <column name = "SOURCE">SALES</column>
        <column name = "COUNT(1)">1</column>
    </item>
</PivotSet>

PIVOT XML hỗ trợ định nghĩa cột động (for source in (select distinct t.source from tst_data t) ) tuy nhiên nó trả về dữ liệu XML. Extractvaluexmltable các hàm cho phép truy vấn các cột cụ thể từ XML ở phía máy chủ nhưng bạn phải chỉ định trước tên trường. Vì vậy, tôi giả định phân tích cú pháp nó ở phía máy khách.

Nếu bạn muốn làm mọi thứ trên DB-layer, có một cách tiếp cận khác. PIVOT (không phải XML) yêu cầu tên cột for source in ('INTERNET', 'DEMO', 'COM', ...) . Có thể tạo một truy vấn như vậy và trả về một con trỏ về phía khách hàng:

CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS 
 cur sys_refcursor;
BEGIN
  open cur for 'select * from dual'; // generate PIVOT query here
  RETURN cur;
END FUNCTION1;

Tôi không biết bất kỳ phương pháp nào để tạo một truy vấn không định kiểu đơn giản từ con trỏ (ở phía máy chủ), vì vậy nếu bạn muốn sử dụng một truy vấn SQL thuần túy, hãy thực hiện theo hai bước:

  1. Tạo truy vấn PIVOT với các cột được đặt tên trong hàm PL / SQL;
  2. Chạy truy vấn từ khách hàng của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kỹ thuật đảo ngược CREATE TABLE trong Oracle

  2. Làm cách nào để cập nhật các ngày được lưu trữ dưới dạng các định dạng ký tự khác nhau (PL / SQL)?

  3. Làm cách nào để so sánh hai giá trị CLOB trong Oracle

  4. ORACLE SQL chọn riêng biệt không xóa các bản sao

  5. Làm thế nào để sử dụng nếu tồn tại - nếu không tồn tại trong PL / SQL?