3

postgresql でキーをクエリする可能性はありますか: 2 番目のレベルの値

たとえば、行の jsonb フィールドは次のようになります。

{
   "something": {
      "v_id": "5544d28431f19", 
      "value": "xyz"
   }, 
   "something_else": {
      "v_id": "5544d28431feb", 
      "value": "abc"
   }
}

次のような v_id 値を使用して、この行を照会します。

  SELECT id, jsonb_field
  FROM table_1
  WHERE jsonb_field @> '{{"v_id": "5544d28431feb"}}'
  ;

ただし、このクエリは無効です。そのようなクエリを達成するにはどうすればよいですか?

編集:

@CraigRingerのコメントによると:

ここでのポイントは、最上位のキーがわからないということです。「任意のオブジェクトについて、次の値を持つ次のキーを持つ内部オブジェクトがあるか」と言いたいのです。

4

1 に答える 1

5

を使用して、テーブルの各行lateral joinを呼び出すことができます。jsonb_eachこの関数は、各ノードをand とjsonb_each呼ばれる 2 つの列を持つ行に変換します。keyvalue

select  value
from    table_1
cross join lateral
        jsonb_each(jsonb_field) sub
where   value @> '{"v_id": "5544d28431feb"}';

完全な例 (Postgres 9.4 の SQL Fiddle サポートはまだありません):

create table table_1 (id int primary key, jsonb_field jsonb);
insert into table_1 (id, jsonb_field) values (42, '{
   "something": {
      "v_id": "5544d28431f19", 
      "value": "xyz"          
   },                                       
   "something_else": {
      "v_id": "5544d28431feb", 
      "value": "abc"
   }
}');

select  value
from    table_1
cross join lateral
        jsonb_each(jsonb_field) t2
where   value @> '{"v_id": "5544d28431feb"}';

これは以下を出力します:

                   value                   
-------------------------------------------
 {"v_id": "5544d28431feb", "value": "abc"}
于 2015-05-02T15:36:14.047 に答える