Как я могу распаковать целое число в число с плавающей точкой в ​​PostgreSQL? - PullRequest
1 голос
/ 03 февраля 2011

Я использую функцию Python struct.pack для упаковки различных типов данных в общее 32-разрядное целочисленное поле в PostgreSQL. Недостатком является то, что я не могу работать с этими значениями в базе данных, мне нужно выполнить struct.unpack в Python для данных, чтобы знать, что они представляют.

Если я упакую 32-разрядное число с плавающей точкой в ​​это поле, есть ли способ заставить PostgreSQL выполнить преобразование для меня?

Я попробовал это, но это не сработало:

select cast(cast(value as bit(32)) as float4) ...

Он успешно преобразует целое число в бит (32), но не преобразует его обратно в число с плавающей точкой.

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

Ответ, который вы, вероятно, не ищете: не делайте этого.

Это нарушение основ: значение в базе данных должно быть атомарным, не делиться на другие значения. Все операции базы данных (я упоминал все ) настроены на обработку отдельных значений. Вы "боретесь с рамками" здесь.

Даже если вы справитесь, это будет тормозить производительность. Кроме того, база данных не подлежит отчётности, проблема не только в том, что у вас возникла эта проблема, каждая попытка прочитать эти данные по любой причине приведет к этой проблеме.

Ну, я не хочу пускаться в разглагольствования, - сказал Нуф.

1 голос
/ 04 февраля 2011

Самое простое решение, которое, я уверен, вы рассмотрели и от которого отказались, - это хранить 32-разрядные значения с плавающей запятой в столбце, определенном для использования 32-разрядного типа данных с плавающей запятой.

CAST () не будет работать для вас, потому что a) CAST () ничего не знает о структурах C, байтах порядка байтов или заполнения, и b) вы не можете привести битовый тип данных к тип данных с плавающей точкой. (Хотя вы можете преобразовать битовый тип данных в целое число.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...