最近、PostgreSQL 9.3.1を使用してJSON機能を活用するようにアップグレードされました。私のテーブルには、次のような構造を持つjsonタイプの列があります。
{
"id": "123",
"name": "foo",
"emails":[
{
"id": "123",
"address": "somethinghere"
},
{
"id": "456",
"address": "soemthing"
}
]
}
これは、質問のための単なるダミーデータです。
Idに基づいてemails配列内の特定のアイテムをクエリすることは可能ですか?
かなり:「メールを返すid = 123)」?
はい、それは可能です:
SELECT *
FROM tbl t, json_array_elements(t.json_col->'emails') AS elem
WHERE elem->>'id' = 123;
tbl
はテーブル名、json_col
はJSON列の名前です。
この関連する回答の詳細:
この関連する回答の最後の段落の暗黙のCROSS JOIN LATERAL
の詳細:
この種類のクエリをサポートするインデックス:
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列)
この投稿に出くわし、次のようにテーブルを直接クエリできることがわかりました。
SELECT *
FROM table_name, json_array_elements(json_column) AS data
WHERE data->>'id' = 123;
この部分を省略:
json_array_elements(t.json_col->'emails')
次のように簡単に実行できます。
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 ;