如何在 PostgreSQL 中仅选择带有 `{ ... "type": "Longitude" ... }` 的行

问题描述 投票:0回答:1

我在 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
    }
  ]
}

(其他人没有纬度/经度消息)

postgresql jsonb
1个回答
0
投票

尝试一下,查询使用

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}
© www.soinside.com 2019 - 2024. All rights reserved.