当前位置: 首页 > 知识库问答 >
问题:

拆分多行CLOB列-Oracle PL/SQL

巴洲
2023-03-14

我有一个表,其中包括一个CLOB字段,该字段的值由逗号分隔的行组成。在输出中,我希望每行都有一行,这些行以一个特定的值开始。我还想从性能上提取一些逗号分隔的值。

输入表(3行):

id         my_clob
001        500,aaa,bbb
           500,ccc,ddd
           480,1,2,bad
           500,eee,fff
002        777,0,0,bad
003        500,yyy,zzz
id         my_clob          line_num    line           second_val
001        500,aaa,bbb      1           500,aaa,bbb    aaa
           500,ccc,ddd
           480,1,2,bad
           500,eee,fff
001        500,aaa,bbb      2           500,ccc,ddd    ccc
           500,ccc,ddd
           480,1,2,bad
           500,eee,fff
001        500,aaa,bbb      3           500,eee,fff    eee
           500,ccc,ddd
           480,1,2,bad
           500,eee,fff
003        500,yyy,zzz      1           500,yyy,zzz    yyy
SELECT 
   id
   ,my_clob
   ,level as line_num
   ,regexp_substr(my_clob,'^500,\S+', 1, level, 'm') as line 
   ,regexp_substr(
        regexp_substr(
            my_clob,'^500,\S+', 1, level, 'm'
        )
        ,'[^,]+', 1, 2
   ) as second_val
FROM tbl
CONNECT BY level <= regexp_count(my_clob, '^500,\S+', 1, 'm')
  and prior id = id
  and prior sys_guid() is not null

'm'将源字符串视为多行。Oracle将插入符号(^)和美元符号($)分别解释为源字符串中任意行的开始和结束

这些regexp_*(my_clob,'^500,\s+',1,m')有什么问题吗?或者更好的是,没有Regex还有更好的性能吗?

共有1个答案

韦高谊
2023-03-14

您可以使用regexp,如下所示:

SQL> -- sample data
SQL> with your_data(id,myclob) as
  2  (select 1, '500,aaa,bbb
  3             500,ccc,ddd
  4             480,1,2,bad
  5             500,eee,fff' from dual)
  6  -- Your query starts from here
  7  select id, myclob, line_num, lines as line,
  8  regexp_substr(lines,'[^,]+',1,2) as second_val
  9  from
 10    (select id, myclob, column_value as line_num,
 11  trim(regexp_substr(d.myclob,'.+',1,column_value,'m')) as lines
 12     from your_data d
 13     cross join table(cast(multiset(select level from dual
 14                                 connect by  level <= regexp_count(d.myclob,'$',1,'m'))
 15     as sys.OdciNumberList)) levels)
 16  where regexp_like(lines,'^[500]');

 ID MYCLOB                    LINE_NUM LINE            SECOND_VAL
--- ------------------------- -------- --------------- ----------
  1 500,aaa,bbb                      1 500,aaa,bbb     aaa
    500,ccc,ddd
    480,1,2,bad
    500,eee,fff

  1 500,aaa,bbb                      2 500,ccc,ddd     ccc
    500,ccc,ddd
    480,1,2,bad
    500,eee,fff

  1 500,aaa,bbb                      4 500,eee,fff     eee
    500,ccc,ddd
    480,1,2,bad
    500,eee,fff


SQL>
 类似资料:
  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue

  • 问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!

  • 我在 spark 中有一个数据帧: 此处,所有列均为字符串数据类型。 如何在多列中使用分解功能,并创建如下所示的新数据框: 在新的数据帧中,所有列都是字符串数据类型。

  • 我有一个包含N个字段的数据框,如下所述。列的数量和值的长度将有所不同。 输入表: 我必须用一个序列列将其转换为以下格式。 预期输出表: 我尝试过使用explode,但explode一次只能使用一个数组。 有人知道我怎么做吗?谢谢你的帮助。

  • 我在presto上有一个表,它有多个记录的记录。在该记录中,我使用了这个简单的SQL查询,

  • 我有一个数据框架,它有一行和几列。有些列是单个值,有些是列表。所有列表列的长度相同。我想将每个列表列拆分为单独的行,同时保留任何非列表列。 样本DF: 我想要什么: 如果我只有一个列表列,那么只需执行< code>explode就很容易了: 然而,如果我尝试分解<code>c</code>列,我得到的数据帧长度为我想要的平方: 我想要的是-对于每一列,取该列中数组的第n个元素,并将其添加到新行。我