【问题标题】:How to extract values from a text CLOB field in SQL如何从 SQL 中的文本 CLOB 字段中提取值
【发布时间】:2014-01-24 04:51:50
【问题描述】:

我有一个用 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

提前致谢,

史蒂夫

【问题讨论】:

  • “不起作用”是一个含糊不清的陈述。在这种情况下是什么意思?
  • 嗨,丹。这会出现一个空白整数错误,尽管我不确定为什么它需要一个整数。

标签: sql regex oracle substr clob


【解决方案1】:
select BINARYTEXT from your_table 
where regexp_like(dat,'^(\CE.TransactionType=)?"[^"]+"$');




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

【讨论】:

  • 嗨赛。这是否考虑到信息在每条记录的单列 CLOB 中的事实?例如。记录 1 CLOB 记录 2 CLOB 记录 3 CLOB 另外,我只寻找 TransactionType 的值,忽略 CLOB 中的所有其他数据行。您提供的 SQL 仅搜索双引号,而不是我需要的实际文本。谢谢
  • 所以你想要像 CE.TransactionType="STANDARDEUROPEAN" 这样的 o/p 吗?
  • 是的,因为 CE.TransactionType=" 永远不会改变,但引号之间的值是变化的,并且是我想要使用查询返回的值。
  • 希望我的编辑对您有所帮助.. 查询将为不匹配的行返回空值
  • 我认为匹配存在问题,因为所有行都是空白的。
【解决方案2】:

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

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

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

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

【讨论】:

  • 嗨 StevieG。感谢您的快速回复。我正在使用 PL/SQL,但使用您的 about SQL 接收并出错:ORA-00904: "BINARYTEXT"."GETCLOBVAL": invalid Identifier。 GetCLOBVal() 函数不是用于序列化 XML 吗?
  • 另请注意,双引号内的值会发生变化,因此我需要在 CE.TransactionType=" 上进行搜索,因为 'STANDARDEUROPEAN' 只是一个示例,因为 'STANDARDNORTHAMERICAN' 是另一种可能性。谢谢
  • 抱歉,您是对的,您只能将 getCLOBVal() 与 XMLType 一起使用。我已经编辑了答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2010-12-11
  • 2015-12-21
相关资源
最近更新 更多