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

Разделяне на текст на колона на редове (извличане на разделител в скоби) ORACLE SQL

Можете да използвате регулярния израз (([^(]*?(\(.*?\))?)*)(,|$) за съвпадение:

  • [^(]*? Нула или повече (но възможно най-малко) знаци в неотварящи скоби
  • (\(.*?\))? След това, по избор, отваряща скоба и възможно най-малко знаци до затварящата скоба.
  • ( )* Обвити в група за улавяне, повторени нула или повече пъти
  • ( ) Обвити в група за улавяне, за да можете да препращате към целия съответстващ елемент
  • (,|$) Следва или запетая, или края на низа.

Като това:

SQL Fiddle

Настройка на схема на Oracle 11g R2 :

CREATE TABLE table_name (ID, Category) ASSELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(орално, CNS , кръв),STO-SE 2 (орални, респираторни ефекти)' ОТ DUAL; 

Заявка 1 :

SELECT ID, l.COLUMN_VALUE AS елемент, REGEXP_SUBSTR( Категория, '(([^(]*?(\(.*?\))?)*)(,|$)', 1, l.COLUMN_VALUE, NULL, 1 ) AS valueFROM table_name t CROSS JOIN TABLE( CAST( MULTISET( SELECT LEVEL FROM DUAL CONNECT BY LEVEL  

Резултати :

<предварителен код>| ID | АРТИКУЛ | СТОЙНОСТ ||----|------|---------------------------------- --|| 1 | 1 | ATD 5(2830) || 1 | 2 | ATO 4(510) || 1 | 3 | EDI 1 || 1 | 4 | EH A1 || 1 | 5 | SCI 2 || 1 | 6 | SS 1 || 1 | 7 | STO-SE 1 (орално, ЦНС, кръв) || 1 | 8 | STO-SE 2 (орални, респираторни ефекти) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да зададете стойност по подразбиране за колона на новосъздадена таблица от оператор select в 11g

  2. Функция LAST_DAY() в Oracle

  3. Потискане на passwd при извикване на sqlplus от shell скрипт

  4. За да промените типа данни на колоната от clob на xmltype

  5. В Oracle, по отношение на синтаксиса - как да преобразувам (+) синтаксиса в модерен конвенционален JOIN?