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的主要内容,如果未能解决你的问题,请参考以下文章