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

Как да разделя заявените данни по разделител в Oracle?

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

(Забележка:това също няма проблемите, които йерархичните заявки правят, когато има множество входни редове, генерирайки експоненциално повече изходни редове на всяка дълбочина, тъй като не може да съпостави всеки ред с неговия родител, така че ще го свърже с всички редове на предишното йерархично ниво.)

Настройка на Oracle :

CREATE TABLE some_table( some_id, value ) AS
  SELECT 8, 'A1,A2,A3;A4,A5,A6' FROM DUAL UNION ALL
  SELECT 8, 'B1,B2,B3;B4,B5,B6' FROM DUAL UNION ALL
  SELECT 8, 'C1,C2,C3;C4,C5,C6' FROM DUAL;

Заявка :

WITH line_start_end ( some_id, value, startidx, endidx ) AS (
  SELECT some_id,
         value,
         1,
         INSTR( value, ';', 1 )
  FROM   some_table
  WHERE  some_id = 8
UNION ALL
  SELECT some_id,
         value,
         endidx + 1,
         INSTR( value, ';', endidx + 1 )
  FROM   line_start_end
  WHERE  endidx > 0
)
SELECT some_id,
       CASE
       WHEN endidx = 0
       THEN SUBSTR( value, startidx )
       ELSE SUBSTR( value, startidx, endidx - startidx )
       END AS value
FROM   line_start_end;

Изход :

db<>fiddle тук



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво означава знак (+) в клауза WHERE на Oracle SQL?

  2. Сливане на два реда в един, като се заменят нулеви стойности

  3. Разбиране на псевдонима на Oracle – защо псевдонимът не се разпознава в заявка, освен ако не е обвит във втора заявка?

  4. Добавете 2 месеца към текущото времеви печат

  5. @Temporal(TemporalType.DATE) с Oracle 12