Я использую функцию Python struct.pack
для упаковки различных типов данных в общее 32-разрядное целочисленное поле в PostgreSQL. Недостатком является то, что я не могу работать с этими значениями в базе данных, я должен выполнить struct.unpack
в Python по данным, чтобы знать, что он представляет.
Если я упакую 32-битный float в это поле, есть ли способ заставить PostgreSQL сделать преобразование для меня?
Я пробовал это, но это не сработало:
select cast(cast(value as bit(32)) as float4) ...
Он успешно перенесет целое число в бит (32), но не вернет его обратно в float.
Самое простое решение, и я уверен, что вы рассмотрели и отказались, заключается в хранении 32-битных значений с плавающей запятой в столбце, предназначенном для использования 32-битного типа данных с плавающей точкой.
CAST() не будет работать для вас, потому что a) CAST() ничего не знает о C-структурах, байтах сущности или заполнении, и b) вы не можете использовать бит типа данных для тип данных с плавающей точкой. (Однако вы можете использовать бит типа данных для целого числа.)
Ответ, который вы, вероятно, не ищете: не делайте этого.
Это является нарушением основ: значение в базе данных должно быть атомарным, а не делимым на другие значения. Все операции с базой данных (я упоминал все) настроены на обработку отдельных значений. Здесь вы "сражаетесь с каркасом".
Даже если вы можете снять его, это будет перетащить на производительность. Кроме того, база данных не подлежит отчетности, это не только то, что у вас есть эта проблема сейчас, каждая попытка прочитать эти данные по любой причине столкнется с этой проблемой.
Ну, я не хочу вдаваться в написание, - сказал нюф.