Le catalogue d'opérateurs de PostgreSQL™ a plusieurs entrées pour
l'opérateur de préfixe @. Ces entrées
implémentent toutes des opérations de valeur absolue pour des
types de données numériques variées. Une de ces entrées est pour
le type float8 (réel) qui est le type
préféré dans la catégorie des numériques. Par conséquent,
PostgreSQL™ utilisera
cette entrée quand il sera en face d'un argument non numérique :
SELECT @ '-4.5' AS "abs";
abs
-----
4.5
(1 row)
Le système a effectué une conversion implicite du type
text vers le type float8 (réel) avant d'appliquer l'opérateur choisi.
Nous pouvons vérifier que float8, et
pas un autre type, a été utilisé :
SELECT @ '-4.5e500' AS "abs";
ERROR: "-4.5e500" is out of range for type double precision
D'un autre côté, l'opérateur préfixe ~
(négation bit par bit) est défini seulement pour les types
entiers et non pas pour float8 (réel).
Ainsi, si nous essayons un cas similaire avec ~, nous obtenons :
SELECT ~ '20' AS "negation";
ERROR: operator is not unique: ~ "unknown"
HINT: Could not choose a best candidate operator. You may need to add explicit
type casts.
Ceci se produit parce que le système ne peut pas décider quel
opérateur doit être préféré parmi les différents opérateurs
~ possibles. Nous pouvons l'aider avec
une conversion explicite :
SELECT ~ CAST('20' AS int8) AS "negation";
negation
----------
-21
(1 row)