web-dev-qa-db-ja.com

JSON列の配列の要素のクエリ

最近、PostgreSQL 9.3.1を使用してJSON機能を活用するようにアップグレードされました。私のテーブルには、次のような構造を持つjsonタイプの列があります。

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 

これは、質問のための単なるダミーデータです。

Idに基づいてemails配列内の特定のアイテムをクエリすることは可能ですか?
かなり:「メールを返すid = 123)」?

25
Joe

はい、それは可能です:

SELECT *
FROM   tbl t, json_array_elements(t.json_col->'emails') AS elem
WHERE  elem->>'id' = 123;

tblはテーブル名、json_colはJSON列の名前です。

この関連する回答の詳細:

この関連する回答の最後の段落の暗黙のCROSS JOIN LATERALの詳細:

この種類のクエリをサポートするインデックス:

52

Postgres 9.4以降のJSONB列では、contains演算子@>を使用して配列の要素をクエリできます。

SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';

詳細については、 JSONタイプ内の配列要素のクエリ を参照してください。

これが実際の例です:

CREATE TABLE jsontest(data JSONB NOT NULL);
INSERT INTO jsontest VALUES (
  '{
     "name": "foo",
     "id": "123",
     "emails": 
     [
       {
         "address": "somethinghere",
         "id": "123"
       },
       {
         "address": "soemthing",
         "id": "456"
       }
     ]
  }'
);
SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';

data
----
{"id": "123", "name": "foo", "emails": [{"id": "123", "address": "somethinghere"}, {"id": "456", "address": "soemthing"}]}

(1列)

7
adamc

この投稿に出くわし、次のようにテーブルを直接クエリできることがわかりました。

SELECT *
FROM   table_name, json_array_elements(json_column) AS data
WHERE  data->>'id' = 123;

この部分を省略:

json_array_elements(t.json_col->'emails')
2
Deepak Mahakale

次のように簡単に実行できます。

SELECT * FROM table WHERE emails->>'id' = '123';

iDを文字列として保存しているようですが、整数の場合は次のようにしてください。

SELECT *  from table WHERE cast(emails->>'id' as integer ) = 123  ;

または、id> 10のすべての行を取得できます

SELECT *  from table WHERE cast(emails->>'id' as integer ) > 10  ;
0
Yunis Hawwash