我在 Next.js 项目中使用
@vercel/postgres
。
我可以成功从 PostgreSQL 数据库中选择行,但只想选择 JSONB 列包含值(而非键)为
Longitude
的行。
表格很简单:
CREATE TABLE IF NOT EXISTS events (
id SERIAL PRIMARY KEY,
json JSONB,
"at" TIMESTAMP WITH TIME ZONE,
"createdAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
我的查询是:
SELECT
id,
at,
json -> 'uplink_message' -> 'decoded_payload' -> 'messages' -> 0 AS message
FROM events
-- WHERE ("json" -> 'uplink_message' -> 'decoded_payload' -> 'messages' -> 0)::jsonb ? 'Longitude'
ORDER BY at
DESC LIMIT ${limit}
但是(已注释掉)
WHERE
子句导致没有选择任何行。
我是 PostgreSQL 新手,所以请原谅(但也要提及)任何错误。
我要选择的行的示例是:
{
"id": 607,
"at": "2024-02-13T14:57:15.000Z",
"message": [
{
"type": "Longitude",
"measurementId": "4197",
"measurementValue": "-1.400000"
},
{
"type": "Latitude",
"measurementId": "4198",
"measurementValue": 50.900000
},
{
"type": "Battery",
"measurementId": "3000",
"measurementValue": 99
}
]
}
(其他人没有纬度/经度消息)
尝试一下,查询使用
jsonb_array_elements
将消息数组转换为一组行,然后根据“type
”键的值过滤这些行。
SELECT
id,
"at",
json -> 'uplink_message' -> 'decoded_payload' -> 'messages' -> 0 AS message
FROM
events,
jsonb_array_elements(json->'uplink_message'->'decoded_payload'->'messages') AS msg
WHERE
msg ->> 'type' = 'Longitude'
ORDER BY
"at" DESC
LIMIT ${limit}