如何从SQL中的文本CLOB字段中提取值

时间:2014-01-06 17:37:33

标签: sql regex oracle substr clob

我有一个填充了CLOB的SQL表列(BINARYTEXT)。在这个CLOB中有许多属性,例如

CE.EffDate="20140106";
CE.CCY="EUR";
CE.TransactionType="STANDARDEUROPEAN";
CE.CAL="LON";

我只需要提取双引号之间包含的CE.TransactionType属性的值'STANDARDEUROPEAN'。请注意,CLOB不包含XML,只包含上述属性,没有开始或结束标记。

当我在命令中指定字符串时,我已经研究了如何使用REGEXP_SUBSTR函数执行此操作:

select REGEXP_SUBSTR('CE.TransactionType="STANDARDEUROPEAN"', '="[^"]+') transtype 
from DUAL

返回:=“STANDARDEUROPEAN

我无法将此操作转换为使用CLOB作为字符串。这不起作用:

select REGEXP_SUBSTR(BINARYTEXT,'CE.TransactionType="STANDARDEUROPEAN"', '="[^"]+')  transtype 
from DUAL

提前致谢,

史蒂夫

2 个答案:

答案 0 :(得分:0)

您可以使用DBMS_LOB包来提取字符串。

SELECT REGEXP_SUBSTR(DBMS_LOB.substr(BINARYTEXT,3000) ,'CE.TransactionType="STANDARDEUROPEAN"', '="[^"]+')  transtype 
FROM YOURTABLENAME

唯一可能遇到问题的是缓冲区大小,限制为32767字节(在我的示例中设置为3000)。如果您的数据大于此值,那么您需要以块的形式查询它。请参阅文档here

如果你需要更改你正在搜索的TransactionType,你应该创建一个函数,它将字符串的那一部分作为参数并动态构建sql。

答案 1 :(得分:0)

select BINARYTEXT from your_table 
where regexp_like(dat,'^(\CE.TransactionType=)?"[^"]+"$');




EDIT2:
select BINARYTEXT from your_table
where regexp_like(dat,'^(\CE.TransactionType=)?"[^"]+"?;$');