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)
如果您只想查询包含值的对象,那么对数组进行无效处理可以正常工作.以下检查包含并返回完整的JSONB:
SELECT * FROM trip
WHERE gps_data_json @> '[{"mode": "WALK"}]';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7226 次 |
| 最近记录: |