Интерпретировать числовое поле как строку в SQL - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 64-битное целочисленное поле в моей базе данных Postgres, которое заполнено 64-битными целыми числами. (Не) по совпадению, эти числа на самом деле являются 8-символьными строками в формате ASCII, с прямым порядком байтов. Например, число 5208208757389214273 является числовым представлением строки «ABCDEFGH»: это 0x4847464544434241 в шестнадцатеричном формате, где 0x41 - это A, 0x42 - это B, 0x43 - это C и т. Д.

Я хотел бы преобразовать эти числа исключительно для целей отображения - то есть найти способ оставить их как числа в базе данных, но иметь возможность видеть их как строки при запросах. Есть ли способ сделать это в SQL? Если не в SQL, могу ли я что-то сделать на стороне сервера (установить расширения, хранимые процедуры, что-нибудь вообще), что позволило бы это? Эту проблему легко решить с помощью любого сценария или языка программирования, но я не знаю, как решить ее с помощью SQL.

P.S. И просто еще один раз для некоторой связки, удовлетворяющей триггеру, с двойной ударов молотком - это не вопрос перевода числа, такого как 5208208757389214273, в строку «5208208757389214273» (у нас есть много ответов о том, как это сделать, но это не так что я ищу).

1 Ответ

0 голосов
/ 10 мая 2018

Используйте to_hex(), чтобы получить шестнадцатеричное представление числа. Затем используйте decode(), чтобы превратить его в bytea. (К сожалению, я не нашел прямого пути от bigint до bytea.) Приведите его к text и reverse(), из-за порядка байтов.

reverse(decode(to_hex(5208208757389214273), 'hex')::text)

ABCDEFGH

Для правильной работы bytea_output должно быть установлено значение 'escape' - используйте SET bytea_output = 'escape';.

(протестировано в версиях 9.4 и 9.6.)

Альтернативный способ достижения того же результата без использования SET следующий:

select reverse(encode(decode(to_hex(5208208757389214273),'hex'),'escape'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...