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

Tách văn bản cột thành các hàng (trích xuất dấu phân cách trong ngoặc) ORACLE SQL

Bạn có thể sử dụng biểu thức chính quy (([^(]*?(\(.*?\))?)*)(,|$) để phù hợp với:

  • [^(]*? Không hoặc nhiều hơn (nhưng càng ít càng tốt) các ký tự không mở ngoặc đơn
  • (\(.*?\))? Sau đó, tùy chọn, một dấu ngoặc mở và càng ít ký tự càng tốt cho đến dấu ngoặc đóng.
  • ( )* Được bao bọc trong một nhóm chụp lặp đi lặp lại không hoặc nhiều lần
  • ( ) Được bao bọc trong một nhóm chụp để có thể tham chiếu toàn bộ mục phù hợp
  • (,|$) Theo sau là dấu phẩy hoặc cuối chuỗi.

Như thế này:

SQL Fiddle

Thiết lập lược đồ Oracle 11g R2 :

CREATE TABLE table_name ( ID, Kategory ) AS
SELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)' FROM DUAL;

Truy vấn 1 :

SELECT ID,
       l.COLUMN_VALUE AS item,
       REGEXP_SUBSTR(
         Kategory,
         '(([^(]*?(\(.*?\))?)*)(,|$)',
         1,
         l.COLUMN_VALUE,
         NULL,
         1
       ) AS value
FROM   table_name t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL
             FROM   DUAL
             CONNECT BY LEVEL < REGEXP_COUNT( t.Kategory, '(([^(]*?(\(.*?\))?)*)(,|$)' )
           )
           AS SYS.ODCINUMBERLIST
         )
       ) l

Kết quả :

| ID | ITEM |                               VALUE |
|----|------|-------------------------------------|
|  1 |    1 |                         ATD 5(2830) |
|  1 |    2 |                          ATO 4(510) |
|  1 |    3 |                               EDI 1 |
|  1 |    4 |                               EH A1 |
|  1 |    5 |                               SCI 2 |
|  1 |    6 |                                SS 1 |
|  1 |    7 |          STO-SE 1(oral, CNS, blood) |
|  1 |    8 | STO-SE 2(oral, respiratory effects) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cấp quyền tạo thư mục trong Oracle

  2. kết nối bằng mệnh đề trong regex_substr

  3. Tiêu chuẩn thay thế cho CONNECT BY?

  4. ORA-65139:Không khớp giữa tệp siêu dữ liệu XML và tệp dữ liệu

  5. Tại sao tôi nhận được không đủ giá trị khi chạy INSERT?