如何使用 Vertica

问题描述

我在 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