0

我正在使用 PostgreSQL 的 MPP 版本,它从 8.3 分叉出来。

我正在尝试使用 where 子句优化选择语句,以仅选择具有私有源 IP 地址和公共目标 IP 地址的行。我有两列 inet 类型,称为 source_ip 和 destination_ip。我觉得以下操作不是最有效的做事方式,因为我正在做一个正则表达式匹配来确定一个 IP 是公共的还是私有的:

where  (text(source_ip) like '10.%'  
    or text(source_ip) like '192.168.%'
    or text(source_ip) ~ E'^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..+')
    and text(destination_ip) not like '10.%'  
    and text(destination_ip) not like '192.168.%'
    and text(destination_ip) !~ E'^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..+';

如何使上述 where 子句更有效?有没有办法不使用正则表达式并使用内置的 postgresql 函数以更快的方式对 inet 类型进行操作?

4

1 回答 1

2
where
    (
        inet '10/8' >> source_ip
        or inet '192.168/16' >> source_ip
        or sourceip >= inet '172.16/16' and sourceip < inet '172.32/16'
    )
    and not inet '10/8' >> destination_ip
    and not inet '192.168/16' >> destination_ip
    and not (destination_ip >= inet '172.16/16' and destination_ip < inet '172.32/16')
于 2013-03-18T18:57:42.497 回答