正常大家平时所见的IP地址通常是用点号(.)分割的四组数字,例如:192.168.0.100,但是做通信行业的朋友可能会比较习惯在数据库表中存储长整型(long)数字,以方便查询比较和节约存储。
如果采用这种方式,那么会经常遇到在点号分割传和长整型之间的转换,在Greenplum中,我们可以通过下面两个函数实现二者之间的轻松转换:
函数主体为:
CREATE OR REPLACE FUNCTION inet_aton(text)
RETURNS bigint AS
$BODY$
SELECT
split_part($1,'.',1)::int8*(256*256*256)+
split_part($1,'.',2)::int8*(256*256)+
split_part($1,'.',3)::int8*256+
split_part($1,'.',4)::int8;
$BODY$
LANGUAGE sql VOLATILE;
CREATE OR REPLACE FUNCTION inet_ntoa(bigint)
RETURNS text AS
$BODY$
SELECT (($1>>24) & 255::int8) || '.' ||
(($1>>16) & 255::int8) || '.' ||
(($1>>8) & 255::int8) || '.' ||
($1 & 255::int8) as result
$BODY$
LANGUAGE sql VOLATILE;
使用演示:
postgres=# select inet_aton('192.168.100.107');
inet_aton
------------
3232261227
(1 row)
postgres=# select inet_ntoa(3232261227);
inet_ntoa
-----------------
192.168.100.107
(1 row)