Oracle的SQL将文本分割成行和过滤器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

我有多行文本数据存储在表行中,就像这里的模拟示例一样。有些行被标记为“重要”,我正在尝试选择所有“重要”行的列表以及相应的ID。

 select 10001 as id, 'some random text 11
 more random text IMPORTANT 12
 more random text IMPORTANT 13' as str
   from dual
  union all
 select 10002, 'other random text 21
 other random text IMPORTANT 22
 other random text 23'
   from dual;

我需要这样的东西......

id      important text
10001   more random text IMPORTANT 12
10001   more random text IMPORTANT 13
10002   other random text IMPORTANT 22

我想在单个SELECT中使用它,没有任何临时表或游标,我一直在查看regexp_substr和查询连接,但我似乎被卡住了。非常感谢您的帮助。

提问于
用户回答回答于

你可以做这样的事情......不完全确定外部查询中的WHERE条件,你可以根据需要调整它(我允许IMPORTANT出现在任何大小写中,我不要求它只是一个单词 - 它可能是“不重要”这个词的一部分,例如,你将不得不解决这个问题)但我相信这不是你要问的主要问题。“主要问题”在子查询中真正得到了解决。

当然,WITH子句不是解决方案的一部分(SELECT查询); 它只提供测试数据。

阅读关于'm'修饰符(对于“多行”) - 它允许^和$在每行文本的开头和结尾匹配,而不是默认(这是整个字符串的开头和结尾,不管新行字符)。

with
  test_data as (
     select 10001 as id, 'some random text 11
more random text IMPORTANT 12
more random text IMPORTANT 13' as str
   from dual
  union all
 select 10002, 'other random text 21
other random text IMPORTANT 22
other random text 23'
   from dual
)
select *
from   (
         select     id, regexp_substr(str, '^.*$', 1, level, 'm') as str_line
         from       test_data
         connect by level <= regexp_count(str, '^.*$', 1, 'm')
                and prior id =  id
                and prior sys_guid() is not null
       )
where upper(str_line) like '%IMPORTANT%'   -- modify this as needed
;

   ID  STR_LINE                        
-----  --------------------------------
10001  more random text IMPORTANT 12   
10001  more random text IMPORTANT 13   
10002  other random text IMPORTANT 22 

扫码关注云+社区

领取腾讯云代金券