从一条记录中减去多个字符串

时间:2016-05-23 20:14:06

标签: postgresql postgresql-9.2

我是Postgres查询的新手。我试图根据特定的集从每个列的记录中提取子字符串。     假设,我从关键字“start'”之间的每个记录中进行子串。 &安培; '端&#39 ;.所以事情是它可以多次出现' start' &安培; '端'在一个记录中,需要提取每组' start'之间的内容。 &安培; '端'关键字。

enter image description here

我们是否有可能在Postgres中使用单个查询来实现此目的,而不是创建一个过程?如果是的话,你能帮忙解决这个问题,或者在我能找到相关信息的地方重新指导我吗?

2 个答案:

答案 0 :(得分:0)

假设/始终分隔元素,您可以使用string_to_array()将字符串转换为多个元素,并unnest()将数组转换为结果。然后,您可以使用regexp_replace()删除花括号中的分隔符:

select d.id, regexp_replace(t.name, '{start}|{end}', '', 'g')
from the_able d
  cross join unnest(string_to_array(d.body,'/')) as t(name);

SQLFiddle示例:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8863

答案 1 :(得分:0)

使用正则表达式实现所有这些,PostgreSQL正则表达式函数regexp_matches(用于匹配标记之间的内容)和regexp_replace(用于删除标记):

with t(id,body) as (values 
                     (1, '{start}John{end}/{start}Jack{end}'),
                     (2, '{start}David{end}'),
                     (3, '{start}Ken{end}/{start}Kane{end}/{start}John{end}'))
select id, regexp_replace(
             (regexp_matches(body, '{start}.*?{end}', 'g'))[1],
             '^{start}|{end}$', '', 'g') matches
from t