Oracle 11g将文本列拆分为行

spi*_*ire 2 sql oracle oracle11g

我有桌子:

ID   |Values
-----+--------------------------------
1    |AB,AD
2    |AG, ... ,BD
3    |AV
Run Code Online (Sandbox Code Playgroud)

我怎样才能将其转换为:

ID   |Value
-----+------
1    |AB
1    |AD
2    |AG
...  |...
2    |BD
3    |AV
Run Code Online (Sandbox Code Playgroud)

Cod*_*odo 6

使用内置的XML函数,您可以这样做:

with sample_data as
(
 select 1 id, 'AB,AD' vals from dual union all
 select 2, 'AG,AK,AJ,BA,BD' from dual union all
 select 3, 'AV' from dual
)
select id, cast(t.column_value.extract('//text()') as varchar2(10)) val
  from sample_data,
  table( xmlsequence( xmltype(
    '<x><x>' || replace(vals, ',', '</x><x>') || '</x></x>'
  ).extract('//x/*'))) t;
Run Code Online (Sandbox Code Playgroud)

结果:

ID   VAL
--- -----
 1   AB
 1   AD
 2   AG
 2   AK
 2   AJ
 2   BA
 2   BD
 3   AV
Run Code Online (Sandbox Code Playgroud)