sql >> Databasteknik >  >> RDS >> Oracle

Dela sträng efter avgränsningsposition med hjälp av oracle

Om du bara har en sträng och du vet att den alltid har exakt fyra delar, kan du dela den så här, genom att bara använda vanliga strängfunktioner (och undvika reguljära uttryck, som är mer flexibla men ofta långsammare).

OBS :Den andra hälften av detta svar adresserar strängar med variabelt antal "delar".

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.

Om antalet delar inte är känt i förväg är det bättre att få utdata i ett annat format (se utdata nedan). Om man behöver ordna delarna i kolumner som kan göras efter att all annan bearbetning är klar - och det är alltid bäst att lämna till rapporteringsapplikationen snarare än att göra i SQL ändå.

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. Använd tabellkolumnvärdet för LIMIT när du utför join

  2. Inkludera Config och Database från andra filer

  3. pip-installationen misslyckas med /usr/bin/clang:Ingen sådan fil eller katalog

  4. Binärt träd med PHP + MySQL