将PostgreSQL中的IP地址转换为整数?

将PostgreSQL中的IP地址转换为整数?,postgresql,ip,Postgresql,Ip,是否有一个查询能够实现这一点 例如,给定一个条目“216.55.82.34”…我想将字符串除以“.”,然后应用以下等式: IP编号=16777216*w+65536*x+256*y+z 其中IP地址=w.x.y.z 仅通过查询就可以实现这一点吗?您可以使用split\u part()。例如: CREATE FUNCTION ip2int(text) RETURNS bigint AS $$ SELECT split_part($1,'.',1)::bigint*16777216 + split

是否有一个查询能够实现这一点

例如,给定一个条目“216.55.82.34”…我想将字符串除以“.”,然后应用以下等式:

IP编号=16777216*w+65536*x+256*y+z 其中IP地址=w.x.y.z


仅通过查询就可以实现这一点吗?

您可以使用
split\u part()
。例如:

CREATE FUNCTION ip2int(text) RETURNS bigint AS $$ 
SELECT split_part($1,'.',1)::bigint*16777216 + split_part($1,'.',2)::bigint*65536 +
 split_part($1,'.',3)::bigint*256 + split_part($1,'.',4)::bigint;
$$ LANGUAGE SQL  IMMUTABLE RETURNS NULL ON NULL INPUT;


SELECT ip2int('200.233.1.2');
>> 3370713346
SELECT ('127.0.0.1'::inet - '0.0.0.0'::inet) as ip_integer
或者,如果不想定义函数,只需:

SELECT split_part(ip,'.',1)::bigint*16777216 + split_part(ip,'.',2)::bigint*65536 +
 split_part(ip,'.',3)::bigint*256 + split_part(ip,'.',4)::bigint;
后者的缺点是,如果值是通过某种计算给出的,而不仅仅是一个表字段,那么计算效率可能会很低,或者写起来很难看。

PG 9.4

create or replace function ip2numeric(ip varchar) returns numeric AS
$$
DECLARE
  ip_numeric numeric;
BEGIN
  EXECUTE format('SELECT inet %L - %L', ip, '0.0.0.0') into ip_numeric;

  return ip_numeric;
END;
$$ LANGUAGE plpgsql;
用法


您只需将inet数据类型转换为bigint:
(inet\u列-'0.0.0.0'::inet)

例如:

CREATE FUNCTION ip2int(text) RETURNS bigint AS $$ 
SELECT split_part($1,'.',1)::bigint*16777216 + split_part($1,'.',2)::bigint*65536 +
 split_part($1,'.',3)::bigint*256 + split_part($1,'.',4)::bigint;
$$ LANGUAGE SQL  IMMUTABLE RETURNS NULL ON NULL INPUT;


SELECT ip2int('200.233.1.2');
>> 3370713346
SELECT ('127.0.0.1'::inet - '0.0.0.0'::inet) as ip_integer
将输出2130706433,这是IP地址127.0.0.1的整数表示

create function dbo.fn_ipv4_to_int( p_ip text)
returns int
as $func$ 
select cast(case when cast( split_part(p_ip, '.', 1 ) as int ) >= 128
then 
(
( 256 - cast(split_part(p_ip, '.', 1 ) as int ))
* 
-power ( 2, 24 ) 
)
+ (cast( split_part(p_ip, '.', 2 ) as int ) * 65536 )
+ (cast( split_part(p_ip, '.', 3 ) as int ) * 256 )
+ (cast( split_part(p_ip, '.', 4 ) as int )  )

else (cast(split_part(p_ip, '.', 1 ) as int) * 16777216)
+ (cast(split_part(p_ip, '.', 2 ) as int) * 65536)
+ (cast(split_part(p_ip, '.', 3 ) as int) * 256)
+ (cast(split_part(p_ip, '.', 4 ) as int))
end as int )
$func$ LANGUAGE SQL  IMMUTABLE RETURNS NULL ON NULL INPUT;

如果你需要得到一个32位的整数,它将返回超过128.0.0.0的IP的负数。如果可以的话,我会使用bigint,但我有一个例子,当我从另一个数据库将数字存储为32位数字时

如果我的列名是ip,我将如何应用此选项?有点混乱这不适用于IPv6,因为它超出了int类型的范围。这是人们在需要将MySQL的
INET\u ATON()
函数转换为Postgres时希望找到的线程。