对于PostgreSQL(v9.5),JSONB给予极好的机会,但是现在我被一个看起来相对简单的操作卡住了;
比较两个jsonb对象;查看一个文档与另一个文档相比有何不同或缺失。
"我目前拥有的“
WITH reports(id,DATA) AS (
VALUES (1,'{"a":"aaa", "b":"bbb", "c":"ccc"}'::jsonb),
(2,'{"a":"aaa", "b":"jjj", "d":"ddd"}'::jsonb) )
SELECT jsonb_object_agg(anon_1.key, anon_1.value)
FROM
(SELECT anon_2.key AS KEY,
reports.data -> anon_2.KEY AS value
FROM reports,
(SELECT DISTINCT jsonb_object_keys(reports.data) AS KEY
FROM reports) AS anon_2
ORDER BY reports.id DESC) AS anon_1
应返回第1行与第2行的差值:
'{"b":"bbb", "c":"ccc", "d":null}'
相反,它也返回重复项({"a": "aaa"}
)。总的来说可能有更优雅的方法!
6条答案
按热度按时间svujldwt1#
已更新
质询:
ryhaxcpt2#
我创建了一个类似的函数,它可以递归地扫描对象,并返回新旧对象之间的差异。我无法找到一个更好的方法来确定jsonb对象是否为空--所以如果有任何简化的建议,我将非常感激。我计划使用它来跟踪对jsonb对象所做的更新,所以我只存储已经更改的内容。
函数如下:
那么简单的查询看起来就像这样:
mrfwxfqh3#
下面是一个不需要创建新函数的解决方案;
结果是;
这个方法只比较json的第一层,不遍历整个对象树。
vybvopom4#
我的解决方案不是递归的,但是你可以用它来检测公共键/值:
结果可能如下所示:
1aaf6o9v5#
这与其他人所做的基本相同,但以右/左"delta"格式报告更改。
示例:
决心:
{"b": {"left": "bbb", "right": "jjj"}}
代码:
ipakzgxi6#
我通过使用
hstore
扩展实现了这一点。请注意,我使用它来记录特定表上发生的任何更改的历史,并且我还从diff对象中删除了
updated_at
。