11

「データ」という列にjsonbとして保存されたデータがあります。

{'people': [{"name": "Bob", "Occupation": "janitor"}, {"name": "Susan", "Occupation", "CEO"}]}

これを次の方法でクエリできます。

SELECT mydata.pk FROM mydata, jsonb_array_elements(mydata.data->'people') AS a WHERE (a->>'name') = 'bob' 

jsonb_array_elements(...) を "a" に置き換えられないのはなぜですか?:

SELECT mydata.pk FROM mydata WHERE (jsonb_array_elements(mydata.data->'people')->>'name') = 'bob' 

代わりに、次のようになります。

ERROR:  argument of WHERE must not return a set
4

1 に答える 1

14

エラー メッセージにあるように、 への引数WHEREはセットを返してはなりません。jsonb_array_elementsセットを返し、単一の値と比較することはできません。2 番目のクエリでは、選択内にクロス結合があり、それを使用する適切な結果に変換しますWHERE

このようにすることもできます

SELECT mydata.pk FROM mydata
  WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');

ここで副選択を使用するとIN、結果が集合でなくなるため、演算子を使用して目的の値を見つけることができます。

別の方法は、jsonb を直接クエリすることです

SELECT mydata.pk FROM mydata
  WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;

この方法では、jsonb を結果セットに変換してその中で検索する必要はありません。

于 2015-06-07T07:18:47.173 に答える