sql >> Database >  >> RDS >> Oracle

String splitsen op positie van scheidingsteken met behulp van orakel

Als je maar één string hebt en je weet dat deze altijd precies vier delen heeft, kun je deze op deze manier splitsen, met alleen standaard stringfuncties (en het vermijden van reguliere expressies, die flexibeler maar vaak langzamer zijn).

OPMERKING :De tweede helft van dit antwoord behandelt strings met een variabel aantal "parts".

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.

Als het aantal onderdelen niet vooraf bekend is, is het beter om de uitvoer in een ander formaat te krijgen (zie de uitvoer hieronder). Als men de onderdelen in kolommen moet rangschikken, kan dat worden gedaan nadat alle andere verwerkingen zijn gedaan - en het is altijd het beste over te laten aan de rapportagetoepassing in plaats van hoe dan ook in 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 gebruiken met Deno en Oak

  2. oci_connect verbinding mislukt

  3. intervalfunctie in orakel

  4. Doctrine-entiteit automatisch genereren uit bestaande tabel