я, наконец, получил отличный ответ от сотрудника ...
Для некоторых разновидностей sql, используйте «split_part» вместе с хостом (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, используйте маску, чтобы ускорить работу вместе с делом заявлением, чтобы получить версию 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
, вы можете добавить преобразование hex-to-int в оператор case, если вы хотите вместо этого указать IPv6 как число.
Для этого нет стандартной функции, и помните, что поля inet и cidr также могут содержать адреса и префиксы IPv6. –
Для моего конкретного приложения все мои адреса - IPv4. –
Похоже, мне нужна версия postet для inet_aton и inet_ntoa, поэтому я могу следить за этим: http://www.hiregion.com/2010/07/converting-ip-address -to-integer-and.html –