現在、ランダムに生成された文字列をハッシュし、ハッシュの一部を使用して0〜99の乱数を生成するPostgresおよびRedshiftの関数があります。私はAzure SQLデータウェアハウスでこの機能を再現しようとしており、PostgresとRedshiftで行うのと同じ値をSQL DWで取得します。Azure SQLデータウェアハウスでバイナリ列を文字列にキャストする
私が実行している問題は、結果をVARCHARにキャストしたり、文字列関数を使用して結果が大きく異なる文字列になった場合です。私は同じVARCHAR
としてmd5関数の結果を取得したいと思います。ここでは、説明するために
は、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なので、変換は簡単です。どちらの関数が値を返す87
-- 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
;
:ここ
は赤方偏移とPostgresのでクエリです。変換を使用して