次の表があります。
CREATE TABLE trip
(
id SERIAL PRIMARY KEY ,
gps_data_json jsonb NOT NULL
);
Gps_data_jsonのJSONには、次のフィールドを持つ旅行オブジェクトの配列が含まれています(以下のサンプルデータ)。
特定の「モード」を含むすべての行を取得しようとしています。
SELECT * FROM trip
where gps_data_json ->> 'mode' = 'WALK';
私は->>演算子を間違って使用していると確信していますが、JSONBフィールドがオブジェクトの配列であることをクエリに誰に伝えるべきかわかりませんか?
サンプルデータ:
INSERT INTO trip (gps_data_json) VALUES
('[
{
"latitude": 47.063480377197266,
"timestamp": 1503056880725,
"mode": "TRAIN",
"longitude": 15.450349807739258
},
{
"latitude": 47.06362533569336,
"timestamp": 1503056882725,
"mode": "WALK",
"longitude": 15.450264930725098
}
]');
INSERT INTO trip (gps_data_json) VALUES
('[
{
"latitude": 47.063480377197266,
"timestamp": 1503056880725,
"mode": "BUS",
"longitude": 15.450349807739258
},
{
"latitude": 47.06362533569336,
"timestamp": 1503056882725,
"mode": "WALK",
"longitude": 15.450264930725098
}
]');
この問題は、->>
演算子が配列をウォークできないために発生します。
json_array_elements
関数を使用してjson配列のネストを解除します。次のクエリはトリックを行います:
WITH
A AS (
SELECT
Id
,jsonb_array_elements(gps_data_json) AS point
FROM trip
)
SELECT *
FROM A
WHERE (point->>'mode') = 'WALK';
クエリされた値を含むオブジェクトのみが必要な場合は、配列のネストを解除しても問題ありません。次のコードは、包含をチェックし、完全なJSONBを返します。
SELECT * FROM trip
WHERE gps_data_json @> '[{"mode": "WALK"}]';