SQL Clob 在 Clob 中使用连接搜索多个字符串,可能是 REGEXP_SUBSTR

Posted

技术标签:

【中文标题】SQL Clob 在 Clob 中使用连接搜索多个字符串,可能是 REGEXP_SUBSTR【英文标题】:SQL Clob search on multiple strings in Clob with join, possibly REGEXP_SUBSTR 【发布时间】:2014-03-26 20:56:50 【问题描述】:

我正在尝试使用 Oracle SQL 从带有 REGEXP_SUBSTR 的 clob 中提取多个字符串。

clob_field 示例:

xxx xxx"xxxxxxxYY=1234xxxxx.xxxx.xxxx"xx       xxxxxxxxxxxxxx  
xxxxx"xxxxxxxYY=2345xxxxx.xxxxx.xxxxxxxxxxxx"xxxx  xxxxxxxxxx  
xxx  xxxxx"xxxxxxxxxxxxxxYY=34567xxxxx.xxx.xxxxx"xxxxxxxxxxxx  
xxxx"xxxxxYY=4567xx.xxxxxx"xxxxxxxxxx   xxxxxxxxxxx  xxxxxxxx  

我试过了:

select a.id, regexp_substr(b.clob_field,'YY=',",[^"]+"') "clob_result"  
from table1 a, table2 b  
where a.id = b.id  

联合查询示例的期望结果是:

id       clob_result  
1        xxxxxxxYY=1234xxxxx.xxxx.xxxx  
1        xxxxxxxYY=2345xxxxx.xxxxx.xxxxxxxxxxxx  
1        xxxxxxxxxxxxxxYY=34567xxxxx.xxx.xxxxx  
1        xxxxxYY=4567xx.xxxxxx  

不清楚如何搜索包含'YY='的字符串,并返回以“开头和结尾的整个字符串。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

您可以使用 REGEXP_REPLACE 来获得多次出现,以及周围的双引号。然后您可以使用 TRIM/REPLACE 删除它们。

SQL Fiddle

with x(y) as (
    select 'xxxx"xxxxxxxYY=1234xxxxx.xxxx.xxxx"xx       xxxxx' from dual union all 
    select 'xx"xxxxxxxYY=2345xxxxx.xxxxx.xxxxxxxxxxxx"xxx xxx' from dual union all 
    select 'xxx"xxxxxxxxxxxxYY=34567xxxxx.xxx.xxxxx"xxxxxxxxx' from dual union all 
    select 'x"xxxxxYY=4567xx.xxxxxx"xx"xxxxxYY=8787xx.xxxx"xx' from dual
    )
select y, replace(trim('"' from regexp_replace(y,
                                               '("[^"]*YY=[^"]*")|(.)',
                                               '\1'
                                              )  -- this will remove anything that is not matched by the regex
                      ),
                  '""',
                  ','
                 ) as clob_result
from x

Results

|                                                 Y |                               CLOB_RESULT |
|---------------------------------------------------|-------------------------------------------|
| xxxx"xxxxxxxYY=1234xxxxx.xxxx.xxxx"xx       xxxxx |             xxxxxxxYY=1234xxxxx.xxxx.xxxx |
| xx"xxxxxxxYY=2345xxxxx.xxxxx.xxxxxxxxxxxx"xxx xxx |    xxxxxxxYY=2345xxxxx.xxxxx.xxxxxxxxxxxx |
| xxx"xxxxxxxxxxxxYY=34567xxxxx.xxx.xxxxx"xxxxxxxxx |       xxxxxxxxxxxxYY=34567xxxxx.xxx.xxxxx |
| x"xxxxxYY=4567xx.xxxxxx"xx"xxxxxYY=8787xx.xxxx"xx | xxxxxYY=4567xx.xxxxxx,xxxxxYY=8787xx.xxxx |

【讨论】:

感谢您对 Peach 的评论,再次感谢 Egor。【参考方案2】:
select 
  regexp_substr(string,'"([^"]*YY=[^"]*)"', 1, 1, '', 1) as clob_result
from your_table

fiddle


  select 
    id, occ,
    regexp_substr(string,'"([^"]*YY=[^"]*)"', 1, occ, '', 1) as clob_result
  from your_table,
       (select level occ from dual connect by level < 99)
  where occ <= regexp_count(string,'"([^"]*YY=[^"]*)"')
  order by id, occ

fiddle

【讨论】:

谢谢叶戈尔!这很好用,但只返回第一次出现。有什么建议可以像“期望的结果”示例一样返回所有出现的事件? @user3466045 - 附加。

以上是关于SQL Clob 在 Clob 中使用连接搜索多个字符串,可能是 REGEXP_SUBSTR的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:clob 字符串中的动态查询。如何打开游标?

从 CLOB ListAgg 值中删除 Oracle SQL 中的 HTML 代码

在 PL/SQL 中插入 clob 数据时出错

在CLOB中搜索列表/表中的单词

clob 类型

CLOB 列和 SQL 插入文件