web-dev-qa-db-ja.com

オブジェクトのPostgres 9.6 JSONB配列のクエリ

次の表があります。

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
      }
    ]');
6
zeisi

この問題は、->>演算子が配列をウォークできないために発生します。

  • まず、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';
13
jlandercy

クエリされた値を含むオブジェクトのみが必要な場合は、配列のネストを解除しても問題ありません。次のコードは、包含をチェックし、完全なJSONBを返します。

SELECT * FROM trip
WHERE gps_data_json @> '[{"mode": "WALK"}]';

参照 JSONBフィールドのオブジェクトのPostgresqlクエリ配列

8
zeisi