在Postgres文本列中搜索并返回所有出现的关键字

时间:2016-03-12 10:25:56

标签: sql postgresql confluence

关于数据库

Confluence页面内容的数据库表名为bodycontent,HTML内容存储在名为body的列中,该列是文本字段。我正在使用Postgres数据库。主键名为bodycontentid

我需要的结果

对于表格中的每一行,我需要在<image>列中找到src标记的所有出现body属性以“http://images.mydomain.com/allImages/%”开头

示例

请说body bodycontentid = 12345包含以下文字:

<h1>Chapter 1</h1>
<image src="http://www.google.com/image/111.jpg"/>
<h1>Chapter 2</h1>
<image src="http://images.mydomain.com/allImages/222.jpg"/>
<h1>Chapter 3</h1>
<image src="http://images.mydomain.com/allImages/333.jpg"/>

运行此查询后的结果应返回:

bodycontentid:12345 bodyhttp://images.mydomain.com/allImages/222.jpg

bodycontentid:12345 bodyhttp://images.mydomain.com/allImages/333.jpg

我尝试了什么

我能够找到至少有一个关键字Im搜索的行(见下文),但我需要的是获得与我的查询匹配的每行所有关键字的列表。

SELECT *
FROM bodycontent
WHERE body LIKE '%http://images.mydomain.com/allImages/%'

1 个答案:

答案 0 :(得分:1)

一种方法是使用regexp_split_to_table()然后使用一些字符串操作:

select bc.bodycontentid,
       left(rst.s, position('"' in rst.s) - 1) as domain
from bodycontent bc, lateral
     regexp_split_to_table(bc.body, E'srce="') rst(s)
where rst.s like 'http://images.mydomain.com/allImages/%';