【发布时间】:2021-11-24 05:11:24
【问题描述】:
使用 PostgreSQL 14.0 PL/SQL(在 do 块内)。尝试:
- 根据动态变量值(名为
cty.cty_name)查询jsonb对象数组(依次具有对象+嵌套数组)中的某个键('county') - 检索值并更改它
- 更新上述 jsonb 以反映 (2) 中的更新值
- 对多个值执行(3)后,创建新表,上面的jsonb为一行一列
步骤 (1) 和 (2) 正确执行。但是,就我的一生而言,我无法弄清楚 (3)。
jsonb object(res) -- 在索引根可能有100个数组项:
[ {"county": "x", "dpa": ["a", "b", "c"]},
{"county": "y", "dpa": ["d", "e", "f"]},
{"county": "z", "dpa": ["h", "i", "j"]},
...
]
上面(1)和(2)的代码:
execute format('select jsonb_path_query_array(''%s'', ''$[*]?(@.%s=="%s")'')',
res,'county',cty.cty_name) into s1;
execute format('select jsonb_array_elements(''%s'')->''%s''', s1,'dpa') into s2;
s2 := s2 || jsonb_build_array(r1.name);
在哪里说:
-
cty.cty_name是y(由select中的for loop创建) -
r1.name是m
s2 保存新值,例如["d", "e", "f", "m"]
现在,要执行 (3) 我需要 path 到 dpa 的哪个键 county 与 res 的某个索引中的值 y 匹配。在jsonb_query_path 和 SQL/JSON 路径、美元引号字符串、jsonb_path_to_array 和 format 查询的双引号地狱、其他使用 idx 或 @987654343 的 SO 解决方案上尝试(但惨遭失败) @(但我的表中没有 JSON),我不得不求助于征求 Borg 集体的智慧。请帮忙。
【问题讨论】:
-
你不会想听这个,但是don't use JSON for that。
-
哈哈.. @LaurenzAlbe 我鄙视 JSON。但是,输出应该是互联网前端的输入;这意味着 JSON 是最简单的设计选择。
-
你不需要动态 SQL。
标签: postgresql plpgsql