如何比较jsonb列的数组元素

时间:2019-08-07 13:01:20

标签: sql postgresql jsonb

我很难找到如何在 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"]

1 个答案:

答案 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')