Jeśli masz tylko jeden ciąg i wiesz, że zawsze ma dokładnie cztery części, możesz go podzielić w ten sposób, używając tylko standardowych funkcji ciągów (i unikając wyrażeń regularnych, które są bardziej elastyczne, ale często wolniejsze).
UWAGA :Druga połowa tej odpowiedzi dotyczy łańcuchów ze zmienną liczbą "części".
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.
Jeśli liczba części nie jest znana z góry, lepiej uzyskać dane wyjściowe w innym formacie (patrz dane wyjściowe poniżej). Jeśli trzeba rozmieścić części w kolumnach, które można wykonać po zakończeniu wszystkich innych operacji - i zawsze najlepiej pozostawić to aplikacji raportującej, a nie robić to w 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.