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

Sql 将逗号分隔的字符串拆分为行,sql,string,oracle,split,Sql,String,Oracle,Split,你能解决这个问题吗 写一个查询 输入表t1 我想要这个输出 sno|sdata 123|abc123 123|abc456 123|bcd789 123|def1011 123|xyz123 请尽可能早地给出解决问题的想法,或多或少 SQL> with test (sno, sdata) as 2 (select 123, 'abc123,abc456,bcd789' from dual union 3 select 123, 'def1011,xyz123' from d

你能解决这个问题吗 写一个查询

输入表t1

我想要这个输出

sno|sdata
123|abc123
123|abc456
123|bcd789
123|def1011
123|xyz123
请尽可能早地给出解决问题的想法,或多或少

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行

基本上,列_值引用第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,它可以完成任务,但这是错误的,或者使用我在问题的第一个答案中向您展示的语法。

请正确设置问题的格式。另外,向我们展示您尝试解决该任务的方法;看一看,新的可口可乐vs经典;18c
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>