1

現在、ランダムに生成された文字列をハッシュし、ハッシュの一部を使用して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のでクエリです。変換を使用して

答えて

4

は、その問題を解決する必要があります。

CONVERT(VARCHAR(32),HashBytes('MD5', 'abc123'),2)

あなたは私たちがvarbinary型の値に変換として必要とされているスタイルのためのパラメータを定義することができますので、それはあります。これは、ここに記載されている:ここ https://technet.microsoft.com/pl-pl/library/ms187928(v=sql.105).aspx

は、変換のバイナリ変換について、その文書から備考一部である:

バイナリスタイル式がバイナリである(N)、VARBINARY(n)は、CHAR(n)は、または varchar(n)、styleは、次の テーブルに示されている値のいずれかになります。表にリストされていないスタイル値はエラーを返します。

0(デフォルト)

はASCII文字にバイナリバイトまたはバイナリ バイトにASCII文字を変換します。各文字またはバイトは1:1に変換されます。 data_typeがバイナリタイプの場合、結果の左にある に文字0xが追加されます。

1、2

data_typeがバイナリ型である場合は、 式は文字式でなければなりません。発現は、16進数(0、1、2、3、4、5、6、 7、8、9、A、B、C、D、E、F、Bの偶数成る でなければなりません、c、d、e、f)である。スタイルが1に設定されている場合 文字0xは式の最初の2文字でなければなりません。 式に奇数個の文字が含まれているか、 のいずれかが無効な場合は、エラーが発生します。 変換された式の長さがdata_typeの長さより大きい場合、 の結果は正しく切り捨てられます。 である固定長のdata_typeは、変換結果のほうが の右側にゼロが追加されます。 data_typeが文字型の場合、式は がバイナリ式でなければなりません。各バイナリ文字は、2つの の16進文字に変換されます。変換された式の長さがdata_typeの長さよりも大きい である場合、それは正しく切り捨てられます。 data_typeが固定サイズの文字タイプで、 変換された結果の長さがdata_typeの長さよりも小さい場合、空白は が変換された式の右側に追加され、 の16進数の偶数を維持します。文字0xは、スタイル1の変換結果の左にある に追加されます。

関連する問題