arrays - 从 JSON Array 字段中获取选定的列列表
问题描述
我有下表包含示例数据:
表:
create table tbl_jtest
(
jdata json
);
insert into tbl_jtest values
('[{"fdate":"2021-01-01","name":"John","add1":"UK"},{"name":"Sam"},{"fdate":"2020-12-12","number":89789}]'),
('[{"name":"Jack","add2":"US","number":12302}]'),
('[{"fdate":"2011-02-11","name":"Lee"},{"number":785412}]'),
('[{"fdate":"2021-06-05","name":"Smith"},{"fdate":"2015-12-10","name":"Will"},{"name":"Jazz","number":556644}]');
我有需要从 JSON Array 列中选择的输入列列表jdata
。
给定的列列表(可能是一个或多个):
列列表:fdate,name,number
预期输出:
jdata
-------------------------------------------------------------------------------------------
[{"fdate":"2021-01-01","name":"John"},{"name":"Sam"},{"fdate":"2020-12-12","number":89789}]
[{"name":"Jack","number":12302}]
[{"fdate":"2011-02-11","name":"Lee"},{"number":785412}]
[{"fdate":"2021-06-05","name":"Smith"},{"fdate":"2015-12-10","name":"Will"},{"name":"Jazz","number":556644}]
解决方案
SELECT
id,
json_agg(new_object) -- 5
FROM (
SELECT
id,
json_object_agg(elems.key, elems.value) as new_object -- 4
FROM tbl_jtest,
json_array_elements(jdata) WITH ORDINALITY a_elems(value, index), -- 1
json_each(a_elems.value) elems -- 2
WHERE elems.key IN ('fdate', 'name', 'number') -- 3
GROUP BY id, a_elems.index
) s
GROUP BY id
您需要提取并展开整个 JSON 对象,以检查键字符串并再次重新聚合过滤后的记录:
- 将数组提取到每个 JSON 对象的一条记录中。添加了一个索引,
WITH ORDINALITY
以便以后能够在重新聚合时识别正确的元素。 - 将每个 JSON 对象的元素提取到一行中。这将创建列
key
和value
- 过滤相关的关键字符串
- 用剩余的
key
/value
对重建 JSON 对象 - 将它们重新聚合到一个新的 JSON 数组中。
推荐阅读
- testing - selenium ide中2个变量的部分文本断言和比较
- google-sheets - 将数组拆分为大小相等的块
- hyperledger-fabric - Fabric 链码容器(nodejs)无法访问 npm
- git - 詹金斯管道:git-lfs:找不到命令
- javascript - document.getElementById("main").innerHTML 不显示或工作
- java - Swagger 架构未显示枚举的自定义值
- reflection - 序列化 Protobuf 反射
- javascript - 从外部服务器获取脚本并将其添加到 html 文件中
- python - 使用 python 子进程 Popen 触摸文件
- react-native - How to change the TouchableOpacity image on press