问题描述
我试图在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