2017-03-20 10 views
0

私は、jsonbカラムを含むPostgresテーブルを持っています。データは任意に深いです。私WHERE句でJSONオブジェクトを指定してPostgres JSONクエリ - すべてのペアと一致し、順序を無視する

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

、私は、任意の順序で同じデータ、それ以上が含まれていないオブジェクトを含む行を検索したいのですが、ネストされたオブジェクトを含めることをお勧めします。

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

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; 

ます(この場合、唯一の第二列)を再帰的に同じ値を持つ同じキーを含むオブジェクトと行を取得します。

+0

優秀!私はそれがとても簡単だろうということを知らなかった:D – PJSCopeland

関連する問題