/ / Wie kann ich eine ganze Zahl in einen Float in PostgreSQL entpacken? - python, sql, postgresql, pack

Wie kann ich eine Ganzzahl in einen Float in PostgreSQL entpacken? - python, sql, postgresql, pack

Ich benutze Python s struct.pack Funktion, um verschiedene Datentypen in ein allgemeines 32-Bit-Integer-Feld in PostgreSQL zu packen. Der Nachteil ist, dass ich mit diesen Werten in der Datenbank nicht arbeiten kann, ich muss ein struct.unpack in Python auf den Daten zu wissen, was es darstellt.

Wenn ich ein 32-Bit-Float in dieses Feld packe, gibt es eine Möglichkeit, PostgreSQL dazu zu bringen, die Konvertierung für mich durchzuführen?

Ich habe es versucht, aber es hat nicht funktioniert:

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

Es wird die Ganzzahl erfolgreich in Bit (32) umgewandelt, aber es wird nicht in einen Gleitkommawert konvertiert.

Antworten:

1 für die Antwort № 1

Die einfachste Lösung, von der Sie sicher überzeugt sind, dass sie verworfen wird, besteht darin, 32-Bit-Fließkommawerte in einer Spalte zu speichern, die für die Verwendung eines 32-Bit-Gleitkommadatentyps definiert ist.

CAST () hat nicht für dich gearbeitet, weil a) CAST ()kennt nichts über C-Structs, Endian-Ness oder Padding-Bytes und b) Sie können einen Bit-Datentyp nicht in einen Fließkomma-Datentyp umwandeln. (Sie können einen Bit-Datentyp jedoch auch in Ganzzahlen umwandeln.)


4 für die Antwort № 2

Eine Antwort, nach der Sie wahrscheinlich nicht suchen: Machen Sie das nicht.

Dies ist eine Verletzung der Grundlagen: Ein Wert in einer Datenbank sollte atomar sein, nicht in andere Werte teilbar sein. Alle Operationen der Datenbank (habe ich erwähnt alle) sind auf den Umgang mit individuellen Werten abgestimmt. Sie "kämpfen den Rahmen" hier.

Selbst wenn Sie es abziehen können, wird es sich ziehenPerformance. Außerdem ist die Datenbank nicht berichtbar. Es ist nicht nur so, dass Sie dieses Problem jetzt haben, jeder Versuch, diese Daten aus irgendeinem Grund zu lesen, führt zu diesem Problem.

Nun, ich möchte nicht in eine Tirade gehen «, sagte Nuf.