我们在表metaTable
中有一个列meta
的jsonb
:
{
"records": {
record1: {
"GUID-1": {
values: ["GUID-value-1", "GUID-value-2", "GUID-value-3"],
type: "..."
},
"GUID-2": {
values: ["GUID-value-4", "GUID-value-5"],
type: "..."
},
"GUID-3": {
values: ["GUID-value-6"],
type: "..."
},
"GUID-4": {
values: ["GUID-value-7"],
type: "..."
}
}
},
"miscellaneous": {
.....
}
}
字符串"GUID-1"
、"GUID-2"
、"GUID-3"
和"GUID-4"
是关键。"GUID-value-1"
、"GUID-value-2"
、"GUID-value-3"
、"GUID-value-4"
、"GUID-value-5"
、"GUID-value-6"
和"GUID-value-7"
是值。
- 键和值都是唯一的。*
我们尝试从JSON文档中删除在给定数组中列出的键和/或嵌套数组元素。例如:["GUID-3", "GUID-value-4", "GUID-value-1", "GUID-value-2", "GUID-value-3", "GUID-value-7", "GUID-4", "random-GUID1", "random-GUID2"]
个
预期结果:
{
"records": {
record1: {
"GUID-2": {
values: ["GUID-value-5"],
type: "..."
}
}
},
"miscellaneous": {
.....
}
}
型
注1:"GUID-1"
被删除,因为数组"values"
是空的。
注2:此SQL将应用于每一行。
我试过:
update metaTable
set "meta" =
json_set("meta", '{records, record1, GUID-1, values}', ("meta" -> 'records' -> 'record1' -> 'GUID-1' -> values) - '{GUID-value-1, GUID-value-2", GUID-value-3}'::text[])
型
只有当我已经知道GUID-
1是键,GUID-value-1, GUID-value-2, and GUID-value-3
是值时,这才有效。
有没有一种通用的方法可以在一个SQL查询中完成它,而不需要事先弄清楚每个查询的角色?
1条答案
按热度按时间anauzrmj1#
这里有一个基本的解决方案:
字符串
fiddle
你可以从它构建你的
UPDATE
。有很多需要解释的。它可以进一步优化。但我觉得这太具体了,对公众没有用处。