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

问题描述 投票:0回答:5

我有一个 SQL 表列 (BINARYTEXT),其中填充了 CLOB。这个 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

返回:=“标准欧洲

我无法将其操纵为使用 CLOB 作为字符串。这不起作用:

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

这会出现一个空白整数错误,尽管我不确定为什么它需要一个整数。

sql regex oracle substr clob
5个回答
0
投票
select BINARYTEXT from your_table 
where regexp_like(dat,'^(\CE.TransactionType=)?"[^"]+"$');




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

0
投票

你可以尝试下面的SQL

select substr ( REGEXP_SUBSTR(to_clob ('CE.EffDate="20140106"; CE.CCY="EUR";CE.TransactionType="STANDARDEUROPEAN";CE.CAL="LON";'), '="[^"]+', 1,3), 3)  transtype from DUAL

0
投票

如果您的数据库没有REGEXP,您可以使用DBMS_LOB包(如StevieG所述)这里是仅使用DBMS_LOB的sql...我使用分号作为分隔符,因为它在问题中的CLOB字符串中

WITH
    table_test As
        (
            Select 
              TO_CLOB('... ... ...
                       Some other text within the CLOB field
                       ...
                       CE.EffDate="20140106";
                       CE.CCY="EUR";
                       CE.TransactionType="STANDARDEUROPEAN";
                       CE.CAL="LON";
                       and yet some more text;
                       and more ...
                       ... ... ...
                    ') "BINARYTEXT"  
            From Dual
        )
Select
    DBMS_LOB.SubStr(
                      DBMS_LOB.SubStr(BINARYTEXT, 100, InStr(BINARYTEXT, 'CE.TransactionType=') + Length('CE.TransactionType=')+1),
                      InStr(DBMS_LOB.SubStr(BINARYTEXT, 100, InStr(BINARYTEXT, 'CE.TransactionType=') + Length('CE.TransactionType=')+1), ';')-2,
                      1
                      
                    ) "TRANSACTION_TYPE"
From
    table_test
-- 
-- Result:
--
-- TRANSACTION_TYPE
-- STANDARDEUROPEAN

0
投票

这是因为

REGEXP_SUBSTR
函数需要一个字符串作为其第一个参数,而
BINARYTEXT
列是 CLOB。要解决此问题,您可以使用
DBMS_LOB
包将 CLOB 转换为字符串。以下查询将起作用:

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

此查询将首先使用

DBMS_LOB.substr
函数将
BINARYTEXT
列转换为最大长度为 3000 个字符的字符串。然后,它将使用
REGEXP_SUBSTR
函数从字符串中提取
CE.TransactionType
属性的值。结果将是一个包含
CE.TransactionType
属性值的字符串,如果未找到该属性,则为
NULL

以下是此查询的输出示例:

| transtype |
|----------|
| STANDARDEUROPEAN |

0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.