有了PostgreSQL(v9.5)种,JSONB种格式提供了绝佳的机会.但现在我只能做一个相对简单的手术;

比较两个jsonb对象;查看一个文档与另一个文档的不同之处或缺失之处.

What I have so far

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"}).而且总的来说,可能有更优雅的方法!

推荐答案

更新

CREATE OR REPLACE FUNCTION jsonb_diff_val(val1 JSONB,val2 JSONB)
RETURNS JSONB AS $$
DECLARE
  result JSONB;
  v RECORD;
BEGIN
   result = val1;
   FOR v IN SELECT * FROM jsonb_each(val2) LOOP
     IF result @> jsonb_build_object(v.key,v.value)
        THEN result = result - v.key;
     ELSIF result ? v.key THEN CONTINUE;
     ELSE
        result = result || jsonb_build_object(v.key,'null');
     END IF;
   END LOOP;
   RETURN result;
END;
$$ LANGUAGE plpgsql;

查询:

SELECT jsonb_diff_val(
    '{"a":"aaa", "b":"bbb", "c":"ccc"}'::jsonb,
    '{"a":"aaa", "b":"jjj", "d":"ddd"}'::jsonb
);
            jsonb_diff_val             
---------------------------------------
 {"b": "bbb", "c": "ccc", "d": "null"}
(1 row)

Postgresql相关问答推荐

从子查询中的排序结果中获取前X行

读取扩展坞合成中的UDP:IO/超时

PostgreSQL plpgsql函数问题

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

Power BI + Postgres:只读用户

PostgreSql maintenance_work_mem 在索引创建期间增加

无法从 docker-compose 上的其他服务解析 postgres 主机名

Windows上的psql:错误:编码UTF8的字节序列无效:0xc8 0x20

在 postgres 中删除所有共享相同前缀的表

SELECT INTO 具有多个归因

Postgresql - 在 Big Data 库中使用数组的性能

在查询中的复合外键/主键列上连接表

无法登录 PostgreSQL 数据库

是否有为 SQL Server 生成完整数据库 DDL 的工具? Postgres 和 MySQL 呢?

SQL 基本类型:integer vs int?

PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ

在 Postgres 中显示关系、序列和函数的默认访问权限

查询 JSON 列中的数组元素

PostgreSQL - 作为表名的动态值

由于不支持身份验证类型 10,无法连接到 Postgres DB