我没能找到解决这个问题的办法.

假设我有一张这样的桌子

with tmp_table(json_row, message) as (
    values 
    ('{"key1": 1, "key2":"first"}'::jsonb, 'this ${key2} is a test of ${key1}'),
    ('{"key1": 2, "key2":"second"}', 'this ${key2} is a test'),
    ('{"key1": 3, "key2":"third"}', 'this ${key1} is a test of ${key2}')
)
select * from tmp_table

enter image description here

如何从另一列的json值替换外部参数,以便预期的结果是

enter image description here

提前谢谢!

编辑:我希望这是与正则表达式-替换,以寻找之间的${}

推荐答案

您可以将regexp_matchesregexp_split_to_table pattern matching functions组合在一起,以从每条消息创建一个字符串部分的表-每一行由一个原义部分和一个${…}替换部分组成,最后一行不包含替换变量.然后,通过从json对象中 Select 相应的密钥进行替换,然后将所有部分放回string_aggregate结果中.对表中的每一行使用子查询执行此操作:

SELECT (
  SELECT string_agg(concat(literal, data->>variable[1]), '')
  FROM (
    SELECT
      regexp_split_to_table(message, '\$\{([^}]*)\}') AS literal,
      regexp_matches(message, '\$\{([^}]*)\}', 'g') AS variable
  ) AS parts
) AS result
FROM example

(online demo)

Postgresql相关问答推荐

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

复合索引列的顺序导致不同的计划

Postgres 11没有强制执行外键约束?

执行准备好的语句不返回数据

pgadmin db 限制服务器属性不起作用

PostgreSQL - 继承表的常见自动增量

替代在 PostgreSQL 函数中嵌套正则表达式替换?

如何在 PSQL 中查找从另一个表继承的子表

PostgreSQL 中基于时间戳的移动平均线

更新列或列或列时触发触发

Rails 重置所有 Postgres 序列?

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

Docker - Postgres 和 pgAdmin 4:Connection refused

从没有行的计数中获取 0 值

使用 Hibernate 查询:colon gets treated as parameter / escaping colon

PostgreSQL:如何在用户级别设置 search_path?

全文的 Postgresql 前缀通配符

删除空行

如何减少存储(缩减)我的 RDS 实例?

PostgreSQL - 如何将数字字段中的秒数转换为 HH:MM:SS