将逗号分隔的字符串拆分为行

时间:2018-02-19 08:52:44

标签: sql string oracle split

你可以解决这个问题吗? 写一个查询

输入表格t1

sno|sdata
123|abc123,abc456,bcd789
123|def1011,xyz123

我想要这个输出

sno|sdata
123|abc123
123|abc456
123|bcd789
123|def1011
123|xyz123

请尽快解决查询

1 个答案:

答案 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(这可以完成工作,但这是错误的),或者使用我在第一个问题答案中向您展示的语法。