- Catégories :
TO_DECIMAL , TO_NUMBER , TO_NUMERIC¶
Convertit une expression d’entrée en un nombre à point fixe. Pour une entrée NULL, la sortie est NULL.
Ces fonctions sont synonymes.
- Voir aussi :
Syntaxe¶
TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Arguments¶
Obligatoire :
expr
Expression de type numérique, caractère ou variante.
Facultatif :
format
Le modèle de format SQL utilisé pour analyser l’entrée
expr
et la sortie. Pour plus d’informations, voir Modèles de format SQL.precision
Le nombre maximal de chiffres décimaux dans le nombre résultant ; de 1 à 38. Dans Snowflake, la précision n’est pas utilisée pour déterminer le nombre d’octets nécessaires à l’enregistrement du nombre et n’a pas d’incidence sur l’efficacité. La valeur par défaut est donc le maximum (38).
scale
Nombre de chiffres décimaux fractionnaires (de 0 à la valeur de
precision
- 1). 0 indique qu’il n’y a pas de chiffres fractionnaires (c’est-à-dire un nombre entier). L’échelle par défaut est 0.
Renvoie¶
La fonction renvoie NUMBER(precision, scale)
.
Si
precision
n’est pas spécifié, la valeur par défaut est 38.Si
scale
n’est pas spécifié, la valeur par défaut est 0.
Notes sur l’utilisation¶
Pour NULL, le résultat est NULL.
Pour les nombres à virgule fixe :
Les nombres ayant des échelles différentes sont convertis soit en ajoutant des zéros à droite (si l’échelle doit être augmentée), soit en réduisant le nombre de chiffres fractionnaires en arrondissant (si l’échelle doit être diminuée).
Notez que les transformations de nombres à virgule fixe en nombres à virgule fixe qui augmentent l’échelle peuvent échouer.
Pour les nombres à virgule flottante :
Les nombres sont convertis s’ils se situent dans l’intervalle représentable, compte tenu de l’échelle.
La conversion entre les nombres fractionnaires binaires et décimaux n’est pas précise. Cela peut entraîner une perte de précision ou des erreurs « out-of-range ».
Les valeurs d’infinité et les NaN (non-nombres) entraînent une erreur de conversion.
Les chaînes de caractères sont converties en nombres décimaux, entiers, fractionnaires ou à virgule flottante.
Pour les entrées fractionnaires, la précision est déduite du nombre de chiffres après le point.
Pour les entrées à virgule flottante, l’omission de la mantisse ou de l’exposant est autorisée et est interprétée comme 0. Ainsi,
E
est analysé comme 0.
Pour une entrée VARIANT :
Si la variante contient une valeur numérique à virgule fixe ou à virgule flottante, une conversion numérique appropriée est effectuée.
Si la variante contient une chaîne, une conversion de chaîne est effectuée.
Si la variante contient une valeur booléenne, le résultat est 0 ou 1 (pour false et true, en conséquence).
Si la variante contient la valeur JSON
null
, la sortie est NULL.
Exemples¶
Créez une table avec une colonne VARCHAR, puis récupérez les valeurs de la chaîne dans la table et transmettez ces valeurs à la fonction TO_NUMBER avec des valeurs precision
et scale
différentes.
CREATE OR REPLACE TABLE number_conv(expr VARCHAR);
INSERT INTO number_conv VALUES ('12.3456'), ('98.76546');
SELECT expr, TO_NUMBER(expr), TO_NUMBER(expr, 10, 1), TO_NUMBER(expr, 10, 8) FROM number_conv;
La requête renvoie le résultat suivant :
+----------+-----------------+------------------------+------------------------+
| EXPR | TO_NUMBER(EXPR) | TO_NUMBER(EXPR, 10, 1) | TO_NUMBER(EXPR, 10, 8) |
|----------+-----------------+------------------------+------------------------|
| 12.3456 | 12 | 12.3 | 12.34560000 |
| 98.76546 | 99 | 98.8 | 98.76546000 |
+----------+-----------------+------------------------+------------------------+
Essayez une requête sur la même table en utilisant la fonction TO_NUMBER pour retourner un nombre avec l’argument precision
de 10
et l’échelle de 9
.
SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
Avec l’argument precision
défini sur 10
, le nombre maximal de chiffres décimaux dans les résultats est 10. Comme les deux valeurs de la table ont deux chiffres avant la virgule et que scale
est défini sur 9
, la requête renvoie une erreur, car les résultats renverraient 11 chiffres.
100039 (22003): Numeric value '12.3456' is out of range
Utilisez différents éléments de format avec la fonction TO_DECIMAL dans une requête :
SELECT column1,
TO_DECIMAL(column1, '99.9') as D0,
TO_DECIMAL(column1, '99.9', 9, 5) as D5,
TO_DECIMAL(column1, 'TM9', 9, 5) as TD5
FROM VALUES ('1.0'), ('-12.3'), ('0.0'), ('- 0.1');
La requête renvoie le résultat suivant :
+---------+-----+-----------+-----------+
| COLUMN1 | D0 | D5 | TD5 |
|---------+-----+-----------+-----------|
| 1.0 | 1 | 1.00000 | 1.00000 |
| -12.3 | -12 | -12.30000 | -12.30000 |
| 0.0 | 0 | 0.00000 | 0.00000 |
| - 0.1 | 0 | -0.10000 | -0.10000 |
+---------+-----+-----------+-----------+
La sortie montre que l’élément de format de texte minimal TM9
affiche précisément le nombre de chiffres de la partie fractionnaire sur la base de l’échelle spécifiée. Pour plus d’informations, voir Formats numériques en texte minimal.
Utilisez l’élément de format X avec la fonction TO_DECIMAL pour convertir une valeur hexadécimale en valeur décimale :
SELECT TO_DECIMAL('ae5', 'XXX');
La requête renvoie le résultat suivant :
+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
| 2789 |
+--------------------------+
Le nombre de chiffres de l’élément format doit être égal ou supérieur au nombre de chiffres de l’expression. Par exemple, essayez d’exécuter la requête suivante :
SELECT TO_DECIMAL('ae5', 'XX');
La requête renvoie une erreur :
100140 (22007): Can't parse 'ae5' as number with format 'XX'