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

Cách chia một đối tượng CLOB bằng cách sử dụng và:dấu phân tách trong Oracle thành nhiều bản ghi

Đây là một giải pháp sử dụng truy vấn con có tính toán đệ quy (Oracle 11.2 trở lên):

with inputs ( str ) as (
       select to_clob('ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0')
       from dual
     ),
     prep ( s, n, token, st_pos, end_pos ) as (
       select ',' || str || ',', -1, null, null, 1
         from inputs
       union all
       select s, n+1, substr(s, st_pos, end_pos - st_pos),
              end_pos + 1, instr(s, ',', 1, n+3)
         from prep
         where end_pos != 0
     )
select n as idx, token as column_name
from   prep
where  n > 0;



   IDX COLUMN_NAME
------ ----------------------------
     1 ABCDEF:PmId12345RmLn1VlId0
     2 ABCDEF:PmId12345RmLn1VlId0
     3 ABCDEF:PmId12345RmLn1VlId0
     4 ABCDEF:PmId12345RmLn1VlId0
     5 ABCDEF:PmId12345RmLn1VlId0

Ghi chú :

Bạn đã nói CLOB nhưng trong ví dụ của bạn, bạn đã trích xuất từ ​​một chuỗi varchar2. Tôi đã thêm to_clob() để xem liệu điều này có hoạt động trên CLOB hay không.

Tôi đã sử dụng instrsubstr , vì chúng thường (thường là?) hoạt động từ tốt hơn đến tốt hơn nhiều so với regexp của chúng tương đương.

Tôi đã lưu "chỉ mục" của mỗi chuỗi con trong chuỗi đầu vào; trong một số trường hợp, thứ tự của các mã thông báo trong chuỗi đầu vào là quan trọng. (Tuy nhiên, không phải trong ví dụ của bạn, bạn chỉ có cùng một mã thông báo lặp lại năm lần.)

Nếu bạn cần hiệu suất tốt hơn, đặc biệt nếu CLOB của bạn rất lớn, bạn có thể tốt hơn nên sử dụng dbms_lob.substrdbms_lob.instr - xem Hiệu suất của SUBSTR trên CLOB , đặc biệt là câu trả lời của Alex Poole và tài liệu tại đây: http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD . Lưu ý sự khác biệt về cú pháp so với substr thông thường / instr .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn sql để kiểm tra xem chuỗi con của cột 1 có chứa giá trị của cột khác hay không

  2. Các dòng mới không mong muốn khi lưu kết quả sqlplus vào tệp xml

  3. Oracle SQL - Làm cách nào để gọi hàm ODCI pipelined bằng JSP

  4. Làm thế nào để tạo một cột trống / trống với truy vấn SELECT trong oracle?

  5. PLS-00201 - mã định danh phải được khai báo