Vor einiger Zeit bin ich über ein mühsames Detail im ansonsten grossartigen PostgreSQL gestolpert. Wir hatten eine Tabelle mit einem numeric Feld. Bei Vergleichen mit Konstanten reklamierte Postgre es könne keinen Operator für die Typen numeric und double precision finden.
Da wir bei den restlichen unterstützten Datenbanken eh double precision verwenden war das gerade ein guter Grund den Typ dieses Feldes zu ändern. Jetzt stellte sich aber herause, dass Postgre nur Konstanten mit weniger als 15 Nachkommastellen als double precision betrachtet. Alles was mehr Stellen hat ist numeric:
daniel=# d tr_table_okpx
Table "tr_table_okpx"
Column | Type | Modifiers
-------------+--------------------------+-----------
id | character(20) | not null
obj_version | bigint |
pvalid | boolean |
pexpires | timestamp with time zone |
pamount | bigint |
pobject | character(20) |
ppassword | character varying(255) |
prating | double precision |
Primary key: tr_table_okpx_pkey
daniel=# SELECT * FROM tr_table_okpx WHERE prating >= 3.5999999999999999996;
ERROR: Unable to identify an operator '>=' for types 'double precision' and 'numeric'
You will have to retype this query using an explicit cast
daniel=# SELECT * FROM tr_table_okpx WHERE prating >= 3.5999999999996;
id | obj_version | pvalid | pexpires | pamount | pobject | ppassword | prating
----+-------------+--------+----------+---------+---------+-----------+---------
(0 rows)
Und da auch ein Upgrade auf die aktuellste PostgreSQL Version nichts gebracht hat müssen wir jetzt halt wohl oder übel diesen Cast benutzen:
SELECT * FROM tr_table_okpx WHERE prating >= 3.5999999999999999996::double precision;
id | obj_version | pvalid | pexpires | pamount | pobject | ppassword | prating
----+-------------+--------+----------+---------+---------+-----------+---------
(0 rows)