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

Tách một chuỗi được phân tách bằng dấu phẩy trong Oracle không hoạt động

Vấn đề trong truy vấn của bạn là mệnh đề where sẽ chỉ được áp dụng cho cấp độ 1 chứ không áp dụng thêm nữa.

Hãy thử điều này bằng cách sử dụng bảng lồng nhau:

WITH xtable AS (
         SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL
         UNION ALL
         SELECT 2 ID, '456,789' AGT FROM DUAL
         UNION ALL
         SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL
     )      
  select regexp_substr(x.AGT,'[^,]+', 1, t.column_value) agt
  from xtable x cross join table(
    cast(
      multiset(
        select level
        from dual
        connect by level <= regexp_count(x.AGT,',') + 1
      )as sys.odcinumberlist
    )
  ) t
  where x.id = 3;

Đó là một truy vấn mục đích chung mà bạn có thể sử dụng ngay cả khi không có mệnh đề where nếu bạn muốn chuyển đổi tất cả chúng cùng một lúc.

Trong Oracle 12c +, bạn có thể sử dụng OUTER APPLY để đạt được hiệu quả tương tự và cú pháp đơn giản hơn:

WITH xtable AS (
         SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL
         UNION ALL
         SELECT 2 ID, '456,789' AGT FROM DUAL
         UNION ALL
         SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL
     )      
  select regexp_substr(x.AGT,'[^,]+', 1, t.n) agt
  from xtable x
  outer apply (
        select level n
        from dual
        connect by level <= regexp_count(x.AGT,',') + 1
  ) t
  where x.id = 3; 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo chuỗi với BẮT ĐẦU VỚI từ Truy vấn

  2. Truy vấn được phân tách bằng dấu phẩy cho nhiều tham số trong PLSQL

  3. Cập nhật tất cả hàng của bảng sau một thời gian cụ thể

  4. Làm thế nào để gửi các tham số tùy ý đến trình kích hoạt Oracle?

  5. Truy vấn trong Oracle để chạy tổng