验证存储在表中的随机 IP 是否属于存储在另一个表中的一组子网

问题描述 投票:0回答:1

我有两个表,名为

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)
      )

这个想法是避免子网硬编码。

有什么想法或建议吗?预先感谢您!

sql presto
1个回答
0
投票

最后,我用以下解决方案解决了这个问题:

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)
    )
© www.soinside.com 2019 - 2024. All rights reserved.