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

Tách chuỗi thành nhiều hàng trong Oracle

Đây có thể là một cách cải tiến (cũng với regexp và kết nối bằng cách):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

CHỈNH SỬA :Đây là một giải thích đơn giản (chẳng hạn như "không chuyên sâu") về truy vấn.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 sử dụng regexp_replace để xóa bất kỳ thứ gì không phải là dấu phân cách (trong trường hợp này là dấu phẩy) và length +1 để biết có bao nhiêu phần tử (lỗi).
  2. Cấp độ chọn select level from dual connect by level <= (...) sử dụng truy vấn phân cấp để tạo một cột có số lượng kết quả phù hợp ngày càng tăng, từ 1 đến tổng số lỗi.

    Xem trước:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList)) thực hiện một số ép kiểu oracle.
    • cast(multiset(.....)) as sys.OdciNumberList chuyển đổi nhiều tập hợp (một tập hợp cho mỗi hàng trong tập dữ liệu ban đầu) thành một tập hợp số duy nhất, OdciNumberList.
    • table() hàm biến đổi một tập hợp thành một tập kết quả.
  4. FROM không có liên kết sẽ tạo tham gia chéo giữa tập dữ liệu của bạn và tập hợp đa. Kết quả là một hàng trong tập dữ liệu có 4 kết quả phù hợp sẽ lặp lại 4 lần (với một số tăng dần trong cột có tên "column_value").

    Xem trước:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) sử dụng column_value với tư cách là nth_appearance / ocention tham số cho regexp_substr .
  6. Bạn có thể thêm một số cột khác từ tập dữ liệu của mình (t.name, t.project làm ví dụ) để dễ hình dung.

Một số tham chiếu đến tài liệu Oracle:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Hằng số mở rộng, loại và ánh xạ (OdciNumberList)
  • CAST (nhiều tập hợp)
  • Truy vấn phân cấp


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:DÀI hay CLOB?

  2. Hàm ROUND (ngày) trong Oracle

  3. Nhận XEM ddl bằng cách sử dụng truy vấn

  4. postgreSQL mysql oracle khác biệt

  5. CASE so với DECODE