我很难找到如何在 jsonb 列中提取 array 的元素的值并制作一个比较。
换句话说,我试图找出proto_nexthop
(是jsonb列中的一个键,该键包含IP地址列表)IP地址是否属于子网84.116.198.0/23
。
SELECT *
FROM vpn.route_targets
WHERE is_ok=true
AND country='INTERNATIONAL'
AND INET ANY(SELECT jsonb_array_elements(pulse -> 'proto_nexthop'))::TEXT << INET '84.116.198.0/23' ;
您能告诉我我做错了什么以及如何实现吗?
示例记录:
# SELECT route_targets.value, pulse -> 'proto_nexthop' FROM vpn.route_targets WHERE is_ok=true AND country='INTERNATIONAL' LIMIT 3 ;
value | ?column?
----------------+------------------------------------------------------------------------------------------------------------
0101:933365229 | ["84.116.198.x"]
0101:933365141 | ["84.116.x.x", "84.116.x.x", "84.116.x.x", "84.116.x.x", "84.116.x.x", "84.116.x.x"]
0101:933365016 | ["84.116.x.x", "84.116.x.x"]
(3 rows)
所需的输出:
value | ?column?
----------------+------------------------------------------------------------------------------------------------------------
0101:933365229 | ["84.116.198.x"]
答案 0 :(得分:1)
您需要取消嵌套数组中的元素,然后在EXISTS运算符中使用它:
SELECT rt.value, rt.pulse -> 'proto_nexthop'
FROM route_targets rt
WHERE is_ok
AND country='INTERNATIONAL'
AND exists (select *
from jsonb_array_elements_text(rt.pulse -> 'proto_nexthop') as x(ip)
where x.ip::inet << INET '84.116.198.0/23')