- Catégories :
TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC¶
Une version spéciale de TO_DECIMAL , TO_NUMBER , TO_NUMERIC qui effectue la même opération de conversion d’une expression d’entrée en nombre à virgule fixe, mais qui prend en charge le traitement des erreurs de sorte que la fonction renvoie NULL si la conversion ne peut pas être effectuée.
Ces fonctions sont synonymes.
Pour plus d’informations, voir Fonctions de conversion de traitement des erreurs.
Syntaxe¶
TRY_TO_DECIMAL( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TRY_TO_NUMBER( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TRY_TO_NUMERIC( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Arguments¶
Obligatoire :
string_exprExpression de type VARCHAR.
Facultatif :
formatLe modèle de format SQL utilisé pour analyser l’entrée
expret la sortie. Pour plus d’informations, voir Modèles de format SQL.precisionLe 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).
scaleNombre 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 une valeur de type NUMBER avec les valeurs par défaut suivantes :
Si
precisionn’est pas spécifiée, alors la valeur par défaut est 38.Si
scalen’est pas spécifiée, alors la valeur par défaut est 0.
Si la conversion ne peut pas être effectuée ou si l’entrée est NULL, renvoie NULL.
Notes sur l’utilisation¶
L’entrée doit être une expression sous forme de chaîne.
Exemples¶
L’exemple suivant échoue, car la dernière colonne (dec_with_range_error) ne stocke pas suffisamment de chiffres significatifs pour pouvoir contenir la valeur qu’il lui est demandé de conserver.
SELECT column1 AS orig_string,
TO_DECIMAL(column1) AS dec,
TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
FROM VALUES ('345.123');
100039 (22003): Numeric value '345.123' is out of range
La requête suivante est identique à la requête précédente, sauf qu’elle utilise TRY_TO_DECIMAL plutôt que TO_DECIMAL. Elle convertit donc la valeur hors limites en NULL :
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1) AS dec,
TRY_TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
TRY_TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
FROM VALUES ('345.123');
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123 | 345 | 345.12 | NULL |
+-------------+-----+----------------+--------------------+
L’exemple suivant échoue, car la chaîne d’entrée contient un signe de dollar ($) et une virgule pour séparer des groupes de chiffres, et pas seulement des chiffres et des points décimaux. Or, le spécificateur de format de la dernière colonne n’indique pas à la fonction TO_DECIMAL qu’elle doit s’attendre au signe du dollar et à la virgule.
SELECT column1 AS orig_string,
TO_DECIMAL(column1, '$9,999.00') AS num,
TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
TO_DECIMAL(column1, 6, 2) AS num_with_format_err
FROM VALUES ('$7,543.21');
100038 (22018): Numeric value '$7,543.21' is not recognized
La requête suivante est identique à la requête précédente, sauf qu’elle utilise TRY_TO_DECIMAL plutôt que TO_DECIMAL, de sorte qu’elle convertisse l’entrée en NULL :
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1, '$9,999.00') AS num,
TRY_TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
TRY_TO_DECIMAL(column1, 6, 2) AS num_with_format_err
FROM VALUES ('$7,543.21');
+-------------+------+----------------+---------------------+
| ORIG_STRING | NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+------+----------------+---------------------|
| $7,543.21 | 7543 | 7543.21 | NULL |
+-------------+------+----------------+---------------------+
L’exemple suivant échoue, car l’expression entrée contient des caractères qui ne sont pas des chiffres :
SELECT column1 AS orig_string,
TO_DECIMAL(column1) AS num
FROM VALUES ('aaa');
100038 (22018): Numeric value 'aaa' is not recognized
La requête suivante est identique à la requête précédente, sauf qu’elle utilise TRY_TO_DECIMAL plutôt que TO_DECIMAL, de sorte qu’elle convertisse l’entrée en NULL :
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1) AS num
FROM VALUES ('aaa');
+-------------+------+
| ORIG_STRING | NUM |
|-------------+------|
| aaa | NULL |
+-------------+------+
Vous pouvez effectuer la conversion si vous spécifiez l’élément de format X avec la fonction TO_DECIMAL ou TRY_TO_DECIMAL pour convertir une valeur hexadécimale en valeur décimale :
SELECT column1 AS orig_string,
TO_DECIMAL(column1, 'XXX') AS to_decimal_num,
TRY_TO_DECIMAL(column1, 'XXX') AS try_to_decimal_num
FROM VALUES ('aaa');
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa | 2730 | 2730 |
+-------------+----------------+--------------------+
Pour d’autres exemples, voir TO_DECIMAL , TO_NUMBER , TO_NUMERIC.