8

これを達成できるクエリはありますか?

たとえば、エントリ「216.55.82.34」が与えられた場合..文字列を「.」で分割し、式を適用します。

IP 番号 = 16777216*w + 65536*x + 256*y + z IP アドレス = wxyz

これはクエリだけで可能でしょうか?

4

5 に答える 5

29

inet データ型を bigint に簡単に変換できます。(inet_column - '0.0.0.0'::inet)

例えば:

SELECT ('127.0.0.1'::inet - '0.0.0.0'::inet) as ip_integer

IP アドレス 127.0.0.1 の整数表現である 2130706433 を出力します。

于 2015-07-10T11:42:24.993 に答える
11

使用できますsplit_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 split_part(ip,'.',1)::bigint*16777216 + split_part(ip,'.',2)::bigint*65536 +
 split_part(ip,'.',3)::bigint*256 + split_part(ip,'.',4)::bigint;

後者の欠点は、値が単なるテーブル フィールドではなく、なんらかの計算によって与えられる場合、計算が非効率になったり、書きにくくなったりする可能性があることです。

于 2013-03-27T15:45:15.753 に答える
1

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;

使用法

select ip2numeric('192.168.1.2');
$ 3232235778
于 2015-07-01T13:20:43.090 に答える