我終於從同事的出色答卷......
對於一些口味sql,使用「split_part」和host(inet)來獲取文本字段。
select split_part(host('101.255.30.40'::inet), '.', 1);
select split_part(host('101.255.30.40'::inet), '.', 2);
select split_part(host('101.255.30.40'::inet), '.', 3);
select split_part(host('101.255.30.40'::inet), '.', 4);
結果
101
255
30
40
如果你想獲得棘手和處理IPv6,使用口罩,以case語句一起加快操作以獲取IP版本:
select
(case
when family('101.255.30.40'::inet) = 4 then split_part(host(broadcast(set_masklen('101.255.30.40'::inet, 32))), '.', 4)::varchar
when family('101.255.30.40'::inet) = 6 then split_part(host(broadcast(set_masklen('101.255.30.40'::inet, 64))), ':', 4)::varchar
else null end)::varchar as octet4;
select
(case
when family('2604:8f00:4:80b0:3925:c69c:458:3f7b'::inet) = 4 then split_part(host(broadcast(set_masklen('2604:8f00:4:80b0:3925:c69c:458:3f7b'::inet, 32))), '.', 4)::varchar
when family('2604:8f00:4:80b0:3925:c69c:458:3f7b'::inet) = 6 then split_part(host(broadcast(set_masklen('2604:8f00:4:80b0:3925:c69c:458:3f7b'::inet, 64))), ':', 4)::varchar
else null end)::varchar as octet4;
40
80b0
如果您想將IPv6轉換爲數字,則可以在case語句中將十六進制轉換爲int轉換。
有這個沒有標準功能,並記住,INET和CIDR領域也可以包含IPv6地址和前綴。 –
對於我的具體應用,所有我的地址是IPv4的 –
看起來我需要INET_ATON和INET_NTOA的Postgres的版本,所以我可以按照這樣的:http://www.hiregion.com/2010/07/converting-ip-address -to-integer-and.html –