sql - 用另一个表的数据替换占位符值
问题描述
我有 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;
(查询未测试,但您有方向)
推荐阅读
- python - TypeError:类型函数的对象不是 JSON 可序列化的
- python - 如何使用所有可能的构造函数参数排列来测试对象/类?
- excel - 打开本地 Access 数据库并连接到 SQL 以运行 Access 宏
- java - 如何在android(Java)中设置lottiefiles动画的循环数?
- php - 如何在 FORM.blade 中禁用可选
- react-native - 无法从“screens/HomeScreen.js”解析“expo-av”
- visual-studio-code - 使用 VSCode,如何比较 Gitlens 中文件的两个非连续提交
- c - 调用 sigaction() 后“struct sigaction”可以重用吗?
- r - R 错误“不知道如何将‘x’转换为类‘POSIXlt’”
- python - Urllib3 自定义 SSL 密钥加密