FirebirdSQL logo
 Structure du langage SQLÉléments communs du langage 
DECFLOAT et fonctions
Utilisation des fonctions conventionnelles

Un certain nombre de fonctions scalaires standard peuvent être utilisées avec des expressions et des valeurs de type DECFLOAT.Cela s’applique aux fonctions mathématiques suivantes :

ABS

CEILING

EXP

FLOOR

LN

LOG

LOG10

POWER

SIGN

SQRT

Les fonctions d’agrégation SUM, AVG, MIN et MAX fonctionnent également avec le type DECFLOAT.Toutes les fonctions d’agrégation statistique (telles que, mais sans s’y limiter, STDDEV ou CORR) peuvent traiter des données de type DECFLOAT.

Fonctions spéciales pour `DECFLOAT

Firebird supporte 4 fonctions qui sont conçues spécifiquement pour supporter le type DECFLOAT :

COMPARE_DECFLOAT

compare deux valeurs DECFLOAT comme étant égales, différentes ou non ordonnées.

NORMALIZE_DECFLOAT

prend un seul argument DECFLOAT et le retourne sous sa forme la plus simple.

QUANTIZE

prend deux arguments DECFLOAT et retourne le premier argument mis à l’échelle en utilisant la deuxième valeur comme échantillon.

TOTALORDER

effectue une comparaison exacte de deux valeurs DECFLOAT.

Sémantique de la comparaison

Les zéros en fin des valeurs décimales en virgule flottante sont conservés.Par exemple, 1,0 et 1,00 sont deux représentations différentes.Cela génère une sémantique de comparaison différente pour le type de données DECFLOAT, comme indiqué ci-dessous.

Comparaison des valeurs numériques

Les zéros de fin sont ignorés dans les comparaisons.Par exemple, 1,0 est égal à 1,00.Par défaut, ce type de comparaison est utilisé pour l’indexation, le tri, le partitionnement des tables, l’évaluation des prédicats et d’autres fonctions — en bref, partout où la comparaison est effectuée implicitement ou dans les prédicats.

Example 1. Comparaison des valeurs numériques
create table stockPrice (stock DECFLOAT(16));

insert into stockPrice
values (4.2);

insert into stockPrice
values (4.2000);

insert into stockPrice
values (4.6125);

insert into stockPrice
values (4.20);

commit;

select * from stockPrice where stock = 4.2;
-- Renvoie trois valeurs 4.2, 4.2000, 4.20

select * from stockPrice where stock > 4.20;
-- Retourne une valeur 4.6125

select * from stockPrice order by stock;
-- Retourne toutes les valeurs, 4.2, 4.2000, 4.20, 4.6125.
-- Les trois premières valeurs sont renvoyées dans un ordre indéfini.
Comparaison TotalOrder

Les zéros de queue sont pris en compte dans la comparaison.Par exemple, 1,0 > 1,00.Chaque valeur DECFLOAT a un ordre dans la sémantique de comparaison TotalOrder.

Selon la sémantique TotalOrder, l’ordre des différentes valeurs est déterminé comme le montre l’exemple suivant :

-nan < -snan < -inf < -0.1 < -0.10 < -0 < 0 < 0.10 < 0.1 < inf < snan < nan
Important

Notez qu’un zéro négatif est inférieur à un zéro positif lors de la comparaison. TotalOrder

Vous pouvez demander une comparaison TotalOrder dans les prédicats en utilisant la fonction intégrée TOTALORDER().

Example 2. Comparaison TotalOrder

Pour les prix des actions, il peut être important de connaître l’exactitude des données.Par exemple, si les taux sont généralement indiqués avec cinq décimales et que le taux est de 4,2 $, il n’est pas clair si le prix est de 4,2000 $, 4,2999 $ ou quelque chose se situant entre ces deux valeurs.

create table stockPrice (stock DECFLOAT(16));

insert into stockPrice
values (4.2);

insert into stockPrice
values (4.2000);

insert into stockPrice
values (4.6125);

insert into stockPrice
values (4.20);

commit;

select * from stockPrice where TOTALORDER(stock, 4.2000) = 0;
-- Renvoie uniquement la valeur 4.2000

select * from stockPrice where TOTALORDER(stock, 4.20) = 1;
-- Renvoie deux valeurs 4.2 et 4.6125, ce qui est supérieur à 4.20

L’ordre dans lequel sont renvoyées des valeurs arithmétiques identiques comportant un nombre différent de zéros de fin n’est pas défini.Ainsi, ORDER BY par la colonne DECFLOAT avec les valeurs 1.0 et 1.00 renvoie deux valeurs dans un ordre aléatoire.De même, DISTINCT renvoie soit 1.0 soit 1.00.