sql - Oracle 的 SQL 将文本拆分成行并过滤
问题描述
我将多行文本数据存储在表格行中,就像这里的模拟示例一样。一些行被标记为“重要”,我正在尝试选择所有“重要”行的列表以及相应的 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 和 connect by 查询,但我似乎被卡住了。您的帮助将不胜感激。
解决方案
你可以做这样的事情......不完全确定外部查询中的 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
推荐阅读
- python - 如何为每个索引值重置 Pandas 中的 rolling()?
- c++ - 当在作为智能指针的函数参数上使用匹配器时,如何修复 Gmock 测试中的内存泄漏?
- python - 如何在python中将Word2Vec向量提供给分类器?
- javascript - 如何在提交表单之前考虑被移动/删除的文件
- xamarin - Xamarin - CollectionView VerticalItemSpacing 不起作用
- javascript - jQuery 选择元素上的更改未反映在 innerHTML/outerHTML 上
- c++ - 抽象类、继承和虚析构函数
- c++ - 根据 c++ 草稿,运行时数组边界在堆栈上
- python - Django:在组上过滤 ListView / 在列表上迭代查询集
- java - 递归方法的Java方法验证