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.