【发布时间】:2013-06-28 20:19:54
【问题描述】:
刚开始玩并测试亚马逊的红移。我需要做的一件事是我可以在 sql 中轻松完成的操作是将 userip 更改为整数。这是在 mssql 中通过一个标量函数完成的,该函数使用 parsename 来分解 ip 编号并通过常量将它们倍增。
CAST(
(CAST(PARSENAME(@IP,4) AS BIGINT) * 16777216) +
(CAST(PARSENAME(@IP,3) AS BIGINT) * 65536) +
(CAST(PARSENAME(@IP,2) AS BIGINT) * 256) +
CAST(PARSENAME(@IP,1) AS BIGINT)
AS BIGINT)
这就是它的样子供参考。
正如我所料,parsename 不是 redshift 中的函数,因此我的问题出现了。你们知道我可以达到相同结果的方法吗?
想通了:
( LEFT(ip_address, STRPOS(ip_address, '.')-1) * 16777216) + (LEFT(SUBSTRING(ip_address, LEN(LEFT(ip_address, STRPOS(ip_address, '.')+1))), LEN (ip_address) - LEN(LEFT(ip_address, STRPOS(ip_address, '.')-1)) - LEN(LEFT(REVERSE(ip_address), STRPOS(REVERSE(ip_address), '.')-1)) - 2) , STRPOS( SUBSTRING(ip_address, LEN(LEFT(ip_address, STRPOS(ip_address, '.')+1)), LEN(ip_address) - LEN(LEFT(ip_address, STRPOS(ip_address, '.')-1))) - LEN(LEFT(REVERSE(ip_address), STRPOS(REVERSE(ip_address), '.')-1)) - 2), '.')-1) * 65536) + (RIGHT( SUBSTRING(ip_address, LEN(LEFT( ip_address, STRPOS(ip_address, '.')+1)), LEN(ip_address) - LEN(LEFT(ip_address, STRPOS(ip_address, '.')-1)) - LEN(LEFT(REVERSE(ip_address), STRPOS( REVERSE(ip_address), '.')-1)) - 2), LEN(SUBSTRING(ip_address, LEN(LEFT(ip_address, STRPOS(ip_address, '.')+1)), LEN(ip_address) - LEN(LEFT (ip_address, STRPOS(ip_address, '.')-1)) - LEN(LEFT(REVERSE(ip_address), STRPOS(REVERSE(ip_address), '.')-1)) - 2)) - STRPOS(SUBSTRING(ip_address) , LEN(L EFT(ip_address, STRPOS(ip_address, '.')+1)), LEN(ip_address) - LEN(LEFT(ip_address, STRPOS(ip_address, '.')-1)) - LEN(LEFT(REVERSE(ip_address), STRPOS(REVERSE(ip_address), '.')-1)) - 2), '.') ) * 256) + (REVERSE( LEFT(REVERSE(ip_address), STRPOS(REVERSE(ip_address), '.')- 1) ) * 1 )
【问题讨论】:
-
“在 sql 中”->“在 Microsoft SQL Server 中”? “SQL”是查询语言,它不是产品。感谢您提到您正在使用 Redshift(ParAccel 的一个非常旧的 PostgreSQL 版本的专有分支),而不仅仅是说“PostgreSQL”。此外,最好发布您自己问题的答案,而不是尽可能编辑您的答案。
标签: sql postgresql amazon-redshift