sql - 用另一个表的数据替换占位符值

标签 sql postgresql postgresql-9.6

我有 2 个表。第一个表包含带有占位符的行,第二个表包含那些占位符值。

我想要一个从第一个表中获取数据并用存储在第二个表中的实际值替换占位符的查询。

例如: 表1数据

id                                      value
608CB424-90BF-4B08-8CF8-241C7635434F    jdbc:postgresql://{POSTGRESIP}:{POSTGRESPORT}/{TESTDB}
CDA4C3D4-72B5-4422-8071-A29D32BD14E0    https://{SERVICEIP}/svc/{TESTSERVICE}/

表2数据

id                                      placeolder      value
201FEBFE-DF92-4474-A945-A592D046CA02    POSTGRESIP      1.2.3.4
20D9DE14-643F-4CE3-B7BF-4B7E01963366    POSTGRESPORT    5432
45611605-F2D9-40C8-8C0C-251E300E183C    TESTDB          mytest
FA8E2E4E-014C-4C1C-907E-64BAE6854D72    SERVICEIP       10.90.30.40
45B76C68-8A0F-4FD3-882F-CA579EC799A6    TESTSERVICE     mytest-service

要求的输出是

id                                      value
608CB424-90BF-4B08-8CF8-241C7635434F    jdbc:postgresql://1.2.3.4:5432/mytest
CDA4C3D4-72B5-4422-8071-A29D32BD14E0    https://10.90.30.40/svc/mytest-service/

最佳答案

如果你想使用类似 Python 的命名占位符,那么你需要写在 plpythonu 上的辅助函数:

create extension plpythonu;

create or replace function formatpystring( str text, a json ) returns text immutable language plpythonu as $$
import json
d = json.loads(a)
return str.format(**d)
$$;

然后简单测试:

select formatpystring('{foo}.{bar}', '{"foo": "win", "bar": "amp"}');
 formatpystring 
----------------
 win.amp

最后,您需要从表格中组合这些参数。很简单:

select t1.id, formatpystring(t1.value, json_object_agg(t2.placeholder, t2.value)) as value
from table1 as t1, table2 as t2
group by t1.id, t1.value;

(查询未测试,但您有方向)

关于sql - 用另一个表的数据替换占位符值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506054/

相关文章:

sql - 有没有更好的方法来创建这个案例查询

postgresql - Postgres在linux中查找配置文件

PostgreSQL - 限制用户仅连接到副本(而不是主节点)

c# - 使用 Dapper 和 Postgres 调用存储过程

sql - 如何过滤掉表中的不同对?

postgresql - 如果我已经将它们流式传输到备用服务器,我是否需要存档 postgres WAL 记录?

postgresql - 使用 postgres 中选定列的值添加时间间隔

php - 需要基本了解 : PHP MySQLi Row Navigation

mysql - 如何将某些表的创建日期插入到新表中?

mysql - 在mysql中创建表时出现日期时间错误