我是Postgres查询的新手。我试图根据特定的集从每个列的记录中提取子字符串。 假设,我从关键字“start'”之间的每个记录中进行子串。 &安培; '端&#39 ;.所以事情是它可以多次出现' start' &安培; '端'在一个记录中,需要提取每组' start'之间的内容。 &安培; '端'关键字。
我们是否有可能在Postgres中使用单个查询来实现此目的,而不是创建一个过程?如果是的话,你能帮忙解决这个问题,或者在我能找到相关信息的地方重新指导我吗?
答案 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