查询Postgres 9.6 JSONB对象数组

zei*_*isi 4 postgresql jsonb postgresql-9.6

我有下表:

CREATE TABLE trip
(
    id SERIAL PRIMARY KEY ,
    gps_data_json jsonb NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

gps_data_json中的JSON包含一系列具有以下字段的trip对象(下面的示例数据):

  • 模式
  • 时间戳
  • 纬度
  • 经度

我正在尝试获取包含某个"模式"的所有行.

SELECT * FROM trip
where gps_data_json ->> 'mode' = 'WALK';
Run Code Online (Sandbox Code Playgroud)

我很确定我使用 - >>运算符错了,但我不确定告诉查询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
      }
    ]');
Run Code Online (Sandbox Code Playgroud)

jla*_*rcy 12

问题出现是因为->>操作员无法遍历数组:

  • 首先使用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';
Run Code Online (Sandbox Code Playgroud)


zei*_*isi 6

如果您只想查询包含值的对象,那么对数组进行无效处理可以正常工作.以下检查包含并返回完整的JSONB:

SELECT * FROM trip
WHERE gps_data_json @> '[{"mode": "WALK"}]';
Run Code Online (Sandbox Code Playgroud)

另请参阅JSONB字段中的Postgresql查询对象数组