在SQL

问题描述:

擦洗IPv4点,四地址给出一个包含存储为VARCHAR(15)点分四组IPv4地址,例如表:在SQL

 ipv4 
-------------- 
172.16.1.100 
172.16.50.5 
172.30.29.28 

什么是一个方便的方式来SELECT所有"ipv4"领域与最后的两个字节擦洗,以便上面变成:

ipv4 
------------ 
172.16.x.y 
172.16.x.y 
172.30.x.y 

目标RDBMS是postgresql 8.4,但越便携越好!

谢谢。

UPDATE:虽然我欣赏(并给予好评)光滑INET/CIDR答案,我期待以产生具有非数字字符的最后两个八位字节取代的输出。 (同样,越便携越好!)

Postgres的:

select regexp_replace('172.16.1.100', E'(.\\d+){2}$', '.x.y'); 
+2

我的Postgres叫我把它写成选择REGEXP_REPLACE(“172.16.1.100”,E'(\\ d +){2} $','.x.y'); – Unreason 2010-03-25 16:49:25

+0

+1。这与我的原始方法有一个明显的改进,那就是:'从E'^(([1-9] [0-9] {0,2} \。){} })')|| 'x.y''谢谢! – pilcrow 2010-03-25 20:16:53

+0

当你不需要使用正则表达式时,不要使用正则表达式。只需使用propper网络功能和运营商。 – 2010-03-26 09:30:38

传统是列类型转换为inet/cidr

编辑: 有了这个本地数据类型有不少specific函数比任何字符串操作都要好得多。

+0

谢谢,*。事实上,源记录是INET类型。但是,这将如何帮助我隐藏最后两个八位字节? (对我来说,我需要从那里转换为字符串类型和munge。) – pilcrow 2010-03-25 17:08:17

如果您使用Postgres类型,那么您可以使用inet操作符来完成此操作,例如。 <<=表示'包含在'内。我怀疑的东西LIK下面会做你的需要:

select my_ipaddress & inet '255.255.0.0' from my_ip_table; 

手册参考:http://www.postgresql.org/docs/8.4/static/functions-net.html

+0

+1这并不坏,最后两个八位字节砸到零... – pilcrow 2010-03-25 17:09:19

+0

这就是你怎么做的! – 2010-03-26 09:30:59