我有一个包含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} }
我该怎么做?
答案 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;
您将获得包含相同键的对象的行,这些键具有相同的递归值(在这种情况下仅为第二行)。