查找一行是否以 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 匹配的第一个捕获部分