我有两个表,名为
stored_ips
和 ip_subnets
。第一个包含名为 ip
的列,其中包含随机 IP,第二个包含名为 ip_cidr
的列,其中包含具有以下格式 '127.0.0.0/16'
的 ip 子网。使用 presto query
,我想获取哪些随机 IP 是存储的 IP CIDR 的一部分。
我一直在尝试使用 Presto 子查询或左连接与
is_subnet_of()
函数,但没有成功。
子查询示例:
SELECT
*
FROM
stored_ips
WHERE
NOT EXISTS (
SELECT
1
FROM
ip_subnets
WHERE
IS_SUBNET_OF(
IPPREFIX(ip_subnets.ip_cidr),
IPADDRESS(stored_ips.ip)
)
)
左连接示例:
SELECT
*
FROM
stored_ips
LEFT JOIN ip_subnets AS is ON IS_SUBNET_OF(
IPPREFIX (ip_subnets.ip_cidr),
CAST(stored_ips.ip as IPADDRESS)
)
但是当我使用静态值时,查询可以工作,例如:
SELECT
*
FROM
stored_ips
WHERE
IS_SUBNET_OF(
IPPREFIX('127.0.0.0/16'),
IPADDRESS(stored_ips.ip)
)
这个想法是避免子网硬编码。
有什么想法或建议吗?预先感谢您!
最后,我用以下解决方案解决了这个问题:
SELECT
*
FROM
stored_ips
CROSS JOIN ip_subnets AS is
WHERE
IS_SUBNET_OF(
CAST(ip_subnets.ip_cidr as IPADDRESS),
CAST(stored_ips.ip as IPADDRESS)
)