これを達成できるクエリはありますか?
たとえば、エントリ「216.55.82.34」が与えられた場合..文字列を「.」で分割し、式を適用します。
IP 番号 = 16777216*w + 65536*x + 256*y + z IP アドレス = wxyz
これはクエリだけで可能でしょうか?
これを達成できるクエリはありますか?
たとえば、エントリ「216.55.82.34」が与えられた場合..文字列を「.」で分割し、式を適用します。
IP 番号 = 16777216*w + 65536*x + 256*y + z IP アドレス = wxyz
これはクエリだけで可能でしょうか?
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 を出力します。
使用できます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;
後者の欠点は、値が単なるテーブル フィールドではなく、なんらかの計算によって与えられる場合、計算が非効率になったり、書きにくくなったりする可能性があることです。
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