输入表格t1
sno|sdata
123|abc123,abc456,bcd789
123|def1011,xyz123
我想要这个输出
sno|sdata
123|abc123
123|abc456
123|bcd789
123|def1011
123|xyz123
请尽快解决查询
答案 0 :(得分:0)
经典,或多或少。
SQL> with test (sno, sdata) as
2 (select 123, 'abc123,abc456,bcd789' from dual union
3 select 123, 'def1011,xyz123' from dual
4 )
5 select
6 sno,
7 regexp_substr(sdata, '[^,]+', 1, column_value) sdata
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(sdata, ',') + 1
11 ) as sys.odcinumberlist));
SNO SDATA
---------- --------------------
123 abc123
123 abc456
123 bcd789
123 def1011
123 xyz123
SQL>
[编辑,以显示如果......会发生什么?]
...你省略第9 - 11行。
基本上,COLUMN_VALUE引用LEVEL(来自第9行)。如果你重写它以便查询不使用任何这些,你会得到重复:
SQL> with test (sno, sdata) as
2 (select 123, 'abc123,abc456,bcd789' from dual union
3 select 123, 'def1011,xyz123' from dual
4 )
5 select
6 sno,
7 regexp_substr(sdata, '[^,]+', 1, level) sdata
8 from test
9 connect by level <= regexp_count(sdata, ',') + 1
10 order by 1, 2;
SNO SDATA
---------- --------------------
123 abc123
123 abc456
123 abc456
123 bcd789
123 bcd789
123 bcd789
123 bcd789
123 def1011
123 xyz123
123 xyz123
10 rows selected.
SQL>
避免它们的一种方法是使用DISTINCT(这可以完成工作,但这是错误的),或者使用我在第一个问题答案中向您展示的语法。