如何比较 jsonb 列的数组元素

how to compare an array element of a jsonb column

我很难找到如何提取 数组 元素 的值 jsonb 列并进行比较。

换句话说,我试图找出 proto_nexthop(是包含 IP 地址列表的 jsonb 列中的键)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"]

您需要从数组中取消嵌套元素,然后在 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')