如何正确查询PostgreSQL的CIDR列以避免匹配遗漏?
PostgreSQL CIDR 查询问题解析
问题根源
你之前使用>>操作符失效,是因为这个操作符表示严格包含——只有当记录的network是目标CIDR的超集且两者不相等时,才会返回true。当network和目标CIDR完全相等(比如都是同一个/32的IPv4或/128的IPv6),>>会返回false,导致精确匹配的情况被遗漏。
现有查询的有效性分析
你现在的查询语句:
SELECT * FROM public.ip_addresses ips WHERE ips.network >>= '108.61.214.189'::CIDR OR ips.network <<= '108.61.214.189'::CIDR
是否全面,取决于你的实际需求:
- 如果需要匹配所有与目标CIDR存在包含关系(记录包含目标/目标包含记录)或完全相等的记录,这个查询是完全覆盖的:
>>=:匹配记录network包含或等于目标CIDR的情况<<=:匹配记录network被目标CIDR包含或等于的情况
- 如果你的需求只是找出所有包含目标IP(含记录
network就是目标IP本身)的记录,那么只需要ips.network >>= '108.61.214.189'::CIDR就足够了,<<=分支是多余的——因为当目标是单个IP(自动转为/32或/128的CIDR)时,<<=只会匹配记录network和目标完全相等的情况,而这已经被>>=覆盖。
额外场景建议
如果你的需求是匹配所有与目标CIDR有交集的记录(不仅仅是包含关系),比如两个部分重叠的子网,那么需要改用&&操作符(表示“重叠/有交集”):
SELECT * FROM public.ip_addresses ips WHERE ips.network && '108.61.214.189'::CIDR
内容的提问来源于stack exchange,提问作者Rami
相关产品推荐
相关产品推荐

