Oracle
 sql >> база данни >  >> RDS >> Oracle

Разделете низ по позиция на разделител с помощта на оракул

Ако имате само един низ и знаете, че той винаги има точно четири части, можете да го разделите по този начин, като използвате само стандартни функции за низ (и избягвате регулярни изрази, които са по-гъвкави, но често по-бавни).

ЗАБЕЛЕЖКА :Втората половина на този отговор адресира низове с променлив брой "части".

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.

Ако броят на частите не е известен предварително, по-добре е да получите изхода в различен формат (вижте изхода по-долу). Ако трябва да подредите частите в колони, това може да се направи, след като е извършена цялата друга обработка - и винаги е най-добре да се остави на приложението за отчитане, вместо да се прави в 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. ORACLE 12.2.01 избор на колони от различни таблици с подобни имена --> използван вътрешен идентификатор на колона

  2. Най-бързият начин за идентифициране на разликите между две таблици?

  3. изпрати променлива тип REFCURSOR към Oracle Съхранена процедура от Java

  4. Oracle изтрива дубликати въз основа на условие

  5. Oracle - Не може да се използва знак * с друга колона в клаузата за избор