sql - 比较 Postgres 中的 JSON 数组

标签 sql postgresql

我有一张表代表购物车中不同时刻的元素。购物车商品以 JSON 格式存储,一列包含 before 值,另一列包含 after 值。

我的任务是比较购物车并确定:添加的商品、删除的商品以及价格/数量的变化。

我知道我可以使用 json_array_elements 和交叉连接来解压缩 JSON blob,从 JSON 值创建一个项目表。但我想不出一种比较购物车商品的有效方法。我可以在 SQL 中执行此操作吗?

这是一个小例子 SQL Fiddle :

CREATE TABLE t (
  id     INT,
  before JSON,
  after  JSON
);

INSERT INTO t VALUES (
  1,
  '[{"category":"item","id":"1","price":8,"quantity":1},{"category":"item","id":"2","price":20,"quantity":1},{"category":"item","id":"3","price":3,"quantity":1}]',
  '[{"category":"item","id":"2","price":40,"quantity":1},{"category":"item","id":"3","price":3,"quantity":1},{"category":"item","id":"4","price":2,"quantity":1}]'
);

这个昂贵的查询没有解决我的问题:

select
  id,
  b.value->>'id' as id_before,
  b.value->>'category' as category_before,
  b.value->>'price' as price_before,
  b.value->>'quantity' as quantity_before,
  a.value->>'id' as id_after,
  a.value->>'category' as category_after,
  a.value->>'price' as price_after,
  a.value->>'quantity' as quantity_after
from t
CROSS JOIN json_array_elements(before) b
CROSS JOIN json_array_elements(after) a;

最佳答案

您可以使用 except all 来获取两个 json 之间的差异,由此您可以获取添加和删除的项目。 为了找到差异,我的查询将是:

select
 value->>'id',
 value->>'category',
 value->>'price',
 value->>'quantity'
FROM
  json_array_elements(before)
EXCEPT ALL
select
 value->>'id',
 value->>'category',
 value->>'price',
 value->>'quantity'
FROM
  json_array_elements(after)

关于sql - 比较 Postgres 中的 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254651/

相关文章:

MYSQL 选择最大值并删除

javascript - 每隔给定时间 self 刷新数据库

mysql - 如何将 Oracle 导出导入 MySQL Workbench?

java - 使用 c3p0 : createClob() is not yet implemented hibernate

sql - 根据postgresql中的条件左连接

java - 使用 JDBCTemplate 将 List<String> 作为 "IN"子句中的查询参数传递时出现 PSQL 异常

sql - 在 PL/SQL 过程中,如何将表名作为参数传递?

java - MySQL 和 Java - 插入表时抛出异常

mysql - 选择计算 SQL 的正值/负值

sql - PostgreSQL - 替换 HTML 实体