我在Redshift中尝试了以下内容
SELECT STRTOL(MD5('345793260804895811'), 10);
但是我得到了以下DBCException
:
SQL错误[22023]:错误:输入cf82576a6dbf9ff63cf9828f990f0673无效转换为基数10
org.postgresql.util.PSQLException:PSQLException:错误:输入cf82576a6dbf9ff63cf9828f990f0673无效转换为基数10
我怎样才能在Redshift中完成这项工作?
答案 0 :(得分:5)
你有两个问题:
BIGINT
值这很好用
SELECT STRTOL(LEFT(MD5('345793260804895811'),15), 16);
将MD5十六进制值缩短为最左边的15个字符,并使用基数16转换为BIGINT
。
答案 1 :(得分:4)
我提出将MD5存储在两个BIGINT字段而不是CHAR(32)中 - 节省2倍空间!
select
convert(bigint,
strtol(substring(hash,1,8),16) * 4294967296.0 +
strtol(substring(hash,9,8),16) - 9223372036854775807
) as hash_part1
,convert(bigint,
strtol(substring(hash,17,8),16) * 4294967296.0 +
strtol(substring(hash,25,8),16) - 9223372036854775807
) as hash_part2
希望它有所帮助。
答案 2 :(得分:0)
MD5的结果是128位长(ref),你不能把它装进32位整数。
答案 3 :(得分:0)
您可以尝试转换基数为16而不是10:
SELECT STRTOL(MD5('cf82576a6dbf9ff63cf9828f990f0673'), 16);