查找一行是否以 clob 中的指定字符串开头,然后提取
finding if a line starts with a specified string in a clob and then extract
我有一个 CLOB 列,我想搜索以“305”开头的行,然后从该行中提取一些内容,我的一些行将有多个以“305”或“305”开头的行整个单元格,所以我只想找到以“305”开头的第一行整个单元格内容被分成这样的行
301|10500000908|
302|20171021|20171104|
303|00001|8306.7|
302|20171008|20171020|
303|00001|13174.5|
302|20170704|20171007|
303|00001|2508.7|
302|20170419|20170703|
303|00001|6962.9|
302|20170330|20170418|
303|00001|7628.2|
302|20170305|20170329|
--- my instr(dbms_lob.substr(flow_data, 4000, 1 ),'305|', 1, 1) keeps finding this line
303|00001|8489.1|
302|20170120|20170304|
303|00001|1997.9|
302|20161021|20170119|
303|00001|12359.8|
302|20160722|20161020|
303|00001|7354.0|
302|20160516|20160721|
303|00001|26.4|
304|20171105|
305|00001|5936.1|
--- i want to find this line and then extract the '5936.1' from it
304|20171021|
305|00001|5710.4|
304|20171008|
305|00001|5163.1|
304|20170704|
304|20170419|
305|00001|7390.8|
304|20170330|
305|00001|7363.2|
304|20170305|
305|00001|7181.4|
304|20170120|
305|00001|9200.2|
304|20161021|
305|00001|4791.3|
305|00001|2877.5|
304|20160516|
305|00001|4116.9|
306|0393|20160511|
307|SUPP|20160511|
310|A|20160511|
311|E|20160516|
当我使用 instr(dbms_lob.substr(flow_data, 4000, 1 ),'305|', 1, 1)
时,它总是找到错误的行。顺便说一句,行与行之间没有空隙,我插入它们以保持文本分隔。
谢谢大家
Mac
如果我没看错的话,你可以用regexp_substr()
:
select regexp_substr(flow_data, '^305\|[^|]*\|([^|]*)', 1, 1, 'm', 1) as val
from t
参数分解:
flow_data
:要搜索的值(允许CLOB
)
'^305\|[^|]*\|([^|]*)'
:正则表达式。我们在一行的开头搜索 305
,并捕获 CSV 列表中的第三个值
1
: 从源字符串开始搜索
1
: return 第一场比赛
m
- 多行模式:^
在每行的开头匹配
1
: return 匹配的第一个捕获部分
我有一个 CLOB 列,我想搜索以“305”开头的行,然后从该行中提取一些内容,我的一些行将有多个以“305”或“305”开头的行整个单元格,所以我只想找到以“305”开头的第一行整个单元格内容被分成这样的行
301|10500000908|
302|20171021|20171104|
303|00001|8306.7|
302|20171008|20171020|
303|00001|13174.5|
302|20170704|20171007|
303|00001|2508.7|
302|20170419|20170703|
303|00001|6962.9|
302|20170330|20170418|
303|00001|7628.2|
302|20170305|20170329|
--- my instr(dbms_lob.substr(flow_data, 4000, 1 ),'305|', 1, 1) keeps finding this line
303|00001|8489.1|
302|20170120|20170304|
303|00001|1997.9|
302|20161021|20170119|
303|00001|12359.8|
302|20160722|20161020|
303|00001|7354.0|
302|20160516|20160721|
303|00001|26.4|
304|20171105|
305|00001|5936.1|
--- i want to find this line and then extract the '5936.1' from it
304|20171021|
305|00001|5710.4|
304|20171008|
305|00001|5163.1|
304|20170704|
304|20170419|
305|00001|7390.8|
304|20170330|
305|00001|7363.2|
304|20170305|
305|00001|7181.4|
304|20170120|
305|00001|9200.2|
304|20161021|
305|00001|4791.3|
305|00001|2877.5|
304|20160516|
305|00001|4116.9|
306|0393|20160511|
307|SUPP|20160511|
310|A|20160511|
311|E|20160516|
当我使用 instr(dbms_lob.substr(flow_data, 4000, 1 ),'305|', 1, 1)
时,它总是找到错误的行。顺便说一句,行与行之间没有空隙,我插入它们以保持文本分隔。
谢谢大家
Mac
如果我没看错的话,你可以用regexp_substr()
:
select regexp_substr(flow_data, '^305\|[^|]*\|([^|]*)', 1, 1, 'm', 1) as val
from t
参数分解:
flow_data
:要搜索的值(允许CLOB
)'^305\|[^|]*\|([^|]*)'
:正则表达式。我们在一行的开头搜索305
,并捕获 CSV 列表中的第三个值1
: 从源字符串开始搜索1
: return 第一场比赛m
- 多行模式:^
在每行的开头匹配1
: return 匹配的第一个捕获部分