问题描述
我在 Vertica db 中有一个表,其中列 ip 的类型为 string,其中包含 ipv4 和 ipv6 两种格式。我需要将 ip 的字符串表示形式转换为数字,例如在这里完成 - https://www.ipaddressguide.com/ipv6-to-decimal
为了处理 ipv4,Vertica 内置了函数:inet_aton() https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/String/INET_ATON.htm
SELECT INET_ATON('1.2.3.4');
inet_aton
-----------
16909060
我正在寻找将 ipv6 地址转换为数字的相同功能: IP 地址 2001:569:7c0e:5700:1133:9bbd:232f:9c78 等于 42540597931374402043102832032222256248
解决方法
好吧 - 您可以将字符串 '0xFF'
硬转换为 NUMERIC(3)
,以获得 255。
考虑到这一点 -
-
对于每个用冒号分隔的字符串标记
-
用
'0'
左填充字符串标记到长度为 4 -
连接8个这样得到的4-char-strings
-
在它们前面加上
'0x'
-
并将所有内容硬投射到
NUMERIC(38,0)
。
WITH
ipv6(ipv6) AS (
SELECT '2001:0569:7c0e:5700:1133:9bbd:232f:9c78'
UNION ALL SELECT '2001:569:7c0e:5700:1133:9bbd:232f:9c78'
)
SELECT
ipv6,(
'0x'
|| LPAD(SPLIT_PART(ipv6,':',1 ),4,'0')
|| LPAD(SPLIT_PART(ipv6,2 ),3 ),4 ),5 ),6 ),7 ),8 ),'0')
)::NUMERIC(38,0) AS ipv6_2_int,'0xff'::NUMERIC(3) AS hex_255
FROM ipv6;
-- out ipv6 | ipv6_2_int | hex_255
-- out -----------------------------------------+----------------------------------------+---------
-- out 2001:0569:7c0e:5700:1133:9bbd:232f:9c78 | 42540597931374402043102832032222256248 | 255
-- out 2001:569:7c0e:5700:1133:9bbd:232f:9c78 | 42540597931374402043102832032222256248 | 255