我在 Postgres 14.2 中有一个包含 3 列的表:name
, name_adds
, aditional
.
这些规则:
name
并且name_adds
可以填充相同的值或不填充。示例:name (john) 和 name_adds (doe) 或两者的值为 (john)列
additional
具有以下两种格式之一:格式一:
{"default":[{"value_1": 100, "value_2": 0.1},{"value_1": 200, "value_2": 0.2}], "non_default":[{"value_1": 200, "value_2": 0.1}, {"value_1": 400, "value_2": 0.1}]}
格式 2:
[{"value_1": 10,"value_2": 11},{"value_1": 1,"value_2": 19}
if (name = name_adds) sum default -> value_1
if (name != name_adds) sum non_default -> value_1
如何根据第3点和第 4点中的规则对第2点的格式 1 或 2 求和?
示例表:
name name_adds additional
---------------------------------------------------------------
john john {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
john doe {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
downy downy [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
downy dan [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
预期结果:
name name_adds sum_result
---------------------------------------------------------------
john john 300
john doe 600
downy downy 11
downy dan 11
我在这个在线演示中尝试了一个查询,但没有得到预期的结果。
db<>在这里摆弄
这依赖于
additional::json -> 'default'
(或'non_default'
分别)在“格式 2”的情况下为 NULL,在这种情况下,我们additional::json
直接使用“格式 1”COALESCE
。然后 unnest with
json_array_elements()
,并提取 sumvalue_1
。该列
additional
应以 typejson
(orjsonb
) 开头。很有可能,使用规范化的关系设计完全取代高度规则的 JSON 列会更好。