Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Podziel ciąg według pozycji ogranicznika za pomocą oracle

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Operator konkatenacji ciągów w Oracle, Postgres i SQL Server

  2. Łączenie ciągów zagregowanych w Oracle 10g

  3. Konwersja funkcji z Oracle na PostgreSQL

  4. formuła uzupełniania kwerendy Oracle sql

  5. Jak odjąć godziny od daty w Oracle, aby miało to również wpływ na dzień?