Как преобразовать двоичный код ULID в строку с помощью Google BigQuery?
Я сохранил данные ULID BINARY в базе данных Google BigQuery. как я могу отформатировать BINARY (BYTE в BigQuery?) в строку ULID?
Спецификация Ulid https://github.com/ulid/spec
Это определение функции версии MariaDB.
DELIMITER //
CREATE OR REPLACE FUNCTION ULID_TO_BINARY(s CHAR(26)) RETURNS BINARY(16) DETERMINISTIC
BEGIN
DECLARE s_base32 CHAR(26);
SET s_base32 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(UPPER(s), 'J', 'I'), 'K', 'J'), 'M', 'K'), 'N', 'L'), 'P', 'M'), 'Q', 'N'), 'R', 'O'), 'S', 'P'), 'T', 'Q'), 'V', 'R'), 'W', 'S'), 'X', 'T'), 'Y', 'U'), 'Z', 'V');
RETURN UNHEX(CONCAT(LPAD(CONV(SUBSTRING(s_base32, 1, 2), 32, 16), 2, '0'), LPAD(CONV(SUBSTRING(s_base32, 3, 12), 32, 16), 15, '0'), LPAD(CONV(SUBSTRING(s_base32, 15, 12), 32, 16), 15, '0')));
END//
CREATE OR REPLACE FUNCTION BINARY_TO_ULID(b BINARY(16)) RETURNS CHAR(26) DETERMINISTIC
BEGIN
DECLARE s_hex CHAR(32);
SET s_hex = LPAD(HEX(b), 32, '0');
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONCAT(LPAD(CONV(SUBSTRING(s_hex, 1, 2), 16, 32), 2, '0'), LPAD(CONV(SUBSTRING(s_hex, 3, 15), 16, 32), 12, '0'), LPAD(CONV(SUBSTRING(s_hex, 18, 15), 16, 32), 12, '0')), 'V', 'Z'), 'U', 'Y'), 'T', 'X'), 'S', 'W'), 'R', 'V'), 'Q', 'T'), 'P', 'S'), 'O', 'R'), 'N', 'Q'), 'M', 'P'), 'L', 'N'), 'K', 'M'), 'J', 'K'), 'I', 'J');
END//
DELIMITER ;
Тесты
SELECT
*
FROM
(
SELECT
BINARY_TO_ULID(ULID_TO_BINARY('01H2SMN7KNGNNJBB0HA155APHB')) as new_balue,
'01H2SMN7KNGNNJBB0HA155APHB' as original_value
) convert_table
WHERE
convert_table.new_balue = convert_table.original_value
Выходы
new_balue |original_value |
--------------------------+--------------------------+
01H2SMN7KNGNNJBB0HA155APHB|01H2SMN7KNGNNJBB0HA155APHB|