如何比较 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')
我很难找到如何提取 数组 的 元素 的值 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')