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

Chia chuỗi theo vị trí dấu phân cách bằng oracle

Nếu bạn chỉ có một chuỗi và bạn biết nó luôn có chính xác bốn phần, bạn có thể chia nó như thế này, chỉ sử dụng các hàm chuỗi tiêu chuẩn (và tránh các biểu thức chính quy, linh hoạt hơn nhưng thường chậm hơn).

LƯU Ý :Nửa sau của câu trả lời này đề cập đến các chuỗi có số lượng "phần" thay đổi.

with inputs ( str ) as (
       select ',,defoifcd,87765' from dual
     )
-- end of TEST data; SQL query begins below (use your actual table and column names)
select substr(str, 1, instr(str, ',') - 1) as part_1,
       substr(str, instr(str, ',') + 1, 
              instr(str, ',', 1, 2) - instr(str, ',') - 1) as part_2,
       substr(str, instr(str, ',', 1, 2) + 1, 
              instr(str, ',', 1, 3) - instr(str, ',', 1, 2) - 1) as part_3,
       substr(str, instr(str, ',', -1) + 1) as part_4
from   inputs;

PART_1   PART_2   PART_3   PART_4
-------- -------- -------- --------
                  defoifcd 87765

1 row selected.

Nếu không biết trước số lượng các bộ phận, tốt hơn nên lấy đầu ra ở định dạng khác (xem đầu ra bên dưới). Nếu một người cần sắp xếp các phần trong các cột có thể được thực hiện sau khi tất cả các xử lý khác được thực hiện - và tốt nhất là nên để ứng dụng báo cáo thay vì thực hiện trong SQL.

with inputs ( id, str ) as (
       select 1, ',,defoifcd,87765' from dual union all
       select 2, ''                 from dual union all
       select 3, 'a, b, c'          from dual
     )
-- end of TEST data; SQL query begins below (use your actual table and column names)
select id, str, level as part_number,
       substr(aug_str, instr(aug_str, ',', 1, level) + 1,
              instr(aug_str, ',', 1, level + 1) - instr(aug_str, ',', 1, level) - 1) as val
from   ( select id, str, ',' || str || ',' as aug_str from inputs)
connect by level <= length(str) - length(translate(str, 'z,', 'z')) + 1
       and prior id = id
       and prior sys_guid() is not null
;

ID STR              PART_NUMBER VAL
-- ---------------- ----------- ----------
 1 ,,defoifcd,87765           1
 1 ,,defoifcd,87765           2
 1 ,,defoifcd,87765           3 defoifcd
 1 ,,defoifcd,87765           4 87765
 2                            1
 3 a, b, c                    1 a
 3 a, b, c                    2  b
 3 a, b, c                    3  c

8 rows selected.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để biết liệu tôi có thực hiện công việc chưa cam kết trong một giao dịch Oracle hay không?

  2. ORA-12704:bộ ký tự không khớp

  3. Kiểm tra xem ngày hiện tại có nằm giữa hai ngày Oracle SQL không

  4. Điều kiện chạy đua giữa lựa chọn và cập nhật

  5. làm thế nào để chèn ngày và giờ trong oracle?