В настоящее время у меня есть функции в Postgres и Redshift, которые берут случайно сгенерированную строку, хешируют ее, а затем используют часть хеша для генерации случайного числа от 0 до 99. Я пытаюсь воспроизвести эту функциональность в хранилище данных SQL Azure, чтобы получить в 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
.