Как я могу распаковать целое число в число с плавающей точкой в PostgreSQL?

1

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

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

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

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

Он успешно перенесет целое число в бит (32), но не вернет его обратно в float.

Теги:
pack

2 ответа

1
Лучший ответ

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

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

4

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню