查询嵌套JSON数组PostrgreSQL中的所有元素

问题描述

我试图在SQL中创建一个查询以检索DNS答案信息,以便可以通过添加TimescaleDB在Grafana中对其进行可视化。现在,我正在努力让postgres一次查询多个元素。我要查询的JSON结构如下:

{
    "Z": 0,"AA": 0,"ID": 56559,"QR": 1,"RA": 1,"RD": 1,"TC": 0,"RCode": 0,"OpCode": 0,"answer": [
        {
            "ttl": 19046,"name": "i.stack.imgur.com","type": 5,"class": 1,"rdata": "i.stack.imgur.com.cdn.cloudflare.net"
        },{
            "ttl": 220,"name": "i.stack.imgur.com.cdn.cloudflare.net","type": 1,"rdata": "104.16.30.34"
        },"rdata": "104.16.31.34"
        },"rdata": "104.16.0.35"
        }
    ],"ANCount": 13,"ARCount": 0,"QDCount": 1,"question": [
        {
            "name": "i.stack.imgur.com","qtype": 1,"qclass": 1
        }
    ]
}

可以有任意数量的答案,包括零个,所以我想找出一种查询所有答案的方法。例如,我试图从每个索引答案中检索ttl字段,我可以查询特定的索引,但是查询所有出现的内容时都会遇到麻烦。


这适用于查询单个索引:

SELECT (data->'answer'->>0)::json->'ttl' 
FROM dns;

环顾四周时,我发现这是查询数组中所有索引的潜在解决方案,但是它似乎没有用,并告诉我“无法从标量中提取元素”:

SELECT answer->>'ttl' ttl
FROM dns,jsonb_array_elements(data->'answer') answer,jsonb_array_elements(answer->'ttl') ttl

解决方法

使用proc将为jsonb_array_elements()数组中的每个对象提供一行。然后可以取消引用该对象:

answer

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...