sql >> Databáze >  >> RDS >> Oracle

Rozdělit řetězec podle pozice oddělovače pomocí oracle

Pokud máte pouze jeden řetězec a víte, že má vždy přesně čtyři části, můžete jej takto rozdělit pouze pomocí standardních řetězcových funkcí (a vyhnout se regulárním výrazům, které jsou flexibilnější, ale často pomalejší).

POZNÁMKA :Druhá polovina této odpovědi se zabývá řetězci s proměnným počtem "částí".

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.

Pokud počet dílů není znám předem, je lepší získat výstup v jiném formátu (viz výstup níže). Pokud potřebujete uspořádat části do sloupců, které lze provést po dokončení všech ostatních zpracování - a vždy je lepší to nechat na aplikaci pro vytváření sestav, než to udělat v 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. mysql Vyhledejte řetězec ve sloupci tabulky s různým pořadím

  2. Existuje způsob, jak vybrat několik řádků pomocí parametrů?

  3. porovnání sloupce se seznamem hodnot v t-sql

  4. Levé spojení, sčítání a počítání seskupte podle