【发布时间】:2018-04-24 20:14:12
【问题描述】:
我目前在 Postgres 和 Redshift 中有函数,它们采用随机生成的字符串,对其进行哈希处理,然后使用部分哈希生成 0-99 之间的随机数。我正在尝试在 Azure SQL 数据仓库中复制此功能,以便在 SQL DW 中获得与在 Postgres 和 Redshift 中相同的值。
我遇到的问题是,当我将结果转换为 VARCHAR 或使用字符串函数时,结果是一个非常不同的字符串。我想将 md5 函数的结果作为相同的VARCHAR。
为了说明,这里是 Azure SQL DW 中的一个查询:
SELECT
'abc123' as random_string,
HASHBYTES('md5', 'abc123') as md5,
CAST(HASHBYTES('md5', 'abc123') AS VARCHAR) as md5_varchar,
RIGHT(HASHBYTES('md5', 'abc123'), 5) as md5_right
;
这会产生
random_string,md5,md5_varchar
abc123,0xE99A18C428CB38D5F260853678922E03,éšÄ(Ë8Õò`…6x’.,6x’.
如您所见,生成的 varchar 与 md5 函数的输出有很大不同。有没有办法将md5的结果转换成相同的字符串?
在 Postgres 和 Redshift 中,md5 函数的结果是一个 VARCHAR,因此对其进行转换很简单。
以下是 Redshift 和 Postgres 中的查询:
-- Redshift
SELECT
'abc123' as random_string,
right(strtol(right(md5('abc123'), 3), 16), 2)::INT as tranche
;
-- Postgres
SELECT
'abc123' as random_string,
right(('x' || lpad(right(md5('abc123'), 3), 4, '0')) :: BIT(16) :: INT :: VARCHAR, 2) :: INT AS tranche
;
两个函数都返回值87。
【问题讨论】:
标签: sql sql-server azure-sql-database azure-sqldw sql-data-warehouse