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

Разделяне на низ на няколко реда в Oracle

Това може да е подобрен начин (също с regexp и свързване чрез):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

РЕДАКТИРАНЕ :Ето едно просто (като "не в дълбочина") обяснение на заявката.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 използва regexp_replace да изтриете всичко, което не е разделител (запетая в този случай) и length +1 за да разберете колко елемента (грешки) има.
  2. select level from dual connect by level <= (...) използва йерархична заявка за да създадете колона с нарастващ брой намерени съвпадения, от 1 до общия брой грешки.

    Визуализация:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList)) прави някои кастинги на типове оракул.
    • cast(multiset(.....)) as sys.OdciNumberList трансформира множество колекции (по една колекция за всеки ред в оригиналния набор от данни) в една колекция от числа, OdciNumberList.
    • table() функция трансформира колекция в набор от резултати.
  4. FROM без съединение създава кръстосано присъединяване между вашия набор от данни и мултинабора. В резултат на това ред в набора от данни с 4 съвпадения ще се повтори 4 пъти (с нарастващ брой в колоната, наречена "column_value").

    Визуализация:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) използва column_value като n-тия_облик/възникване параметър за regexp_substr .
  6. Можете да добавите някои други колони от вашия набор от данни (t.name, t.project като пример) за лесна визуализация.

Някои препратки към документи на Oracle:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Константи, типове и съпоставяния на разширяемост (OdciNumberList)
  • CAST (многонабор)
  • Йерархични заявки


  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 Connect по клауза еквивалент в SQL Server

  2. Oracle SQL:Използвайте последователност при вмъкване с Select Statement

  3. Как да изброите всички изгледи в базата данни на Oracle

  4. Как да променя формата на датата от ММ/ДД/ГГГГ на ГГГГ-ММ-ДД в PL/SQL?

  5. Заключване на Liquibase - причини?