Postgres JSON查询 - 匹配所有对,忽略顺序

时间:2017-03-20 03:43:19

标签: json postgresql

我有一个包含jsonb列的Postgres表,其中的数据是任意深的。

id | jsonb_data
---|----------------------
1  | '{"a":1}'
2  | '{"a":1,"b":2}'
3  | '{"a":1,"b":2,"c":{"d":4}}'

在我的WHERE子句中给定一个JSON对象,我希望找到包含相同数据但不包含任何内容的对象的行,但包括,优选地,嵌套对象。

SELECT * FROM table
WHERE json_match_ignore_order(jsonb_data, '{"b":2,"a":1}');

id | jsonb_data
---|-----------
2  | '{"a":1,"b":2}'

这基本上与以下Ruby代码完全相同,但如果可能的话,我真的很想在数据库中这样做。

table.select { |row| row.jsonb_data_as_a_hash == {b: 2, a: 1} }

我该怎么做?

1 个答案:

答案 0 :(得分:1)

使用jsonb类型,即使对于具有嵌套对象的值,也可以使用等号。

因此以下内容也有效:

create table jsonb_table(
  id serial primary key,
  jsonb_data jsonb
);

insert into jsonb_table(jsonb_data)
values
  ('{"a":1}'),
  ('{"a":{"c":5},"b":2}'),
  ('{"a":{"c":5},"b":2,"c":{"d":4}}');

select * from jsonb_table
where jsonb_data = '{"b":2,"a":{"c":5}}'::jsonb;

您将获得包含相同键的对象的行,这些键具有相同的递归值(在这种情况下仅为第二行)。