- 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 (c’est-à-dire convertit une expression d’entrée en nombre à point fixe), mais avec une prise en charge du traitement des erreurs (c’est-à-dire que si la conversion ne peut pas être effectuée, elle retourne une valeur NULL au lieu de produire une erreur).
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_expr
Expression de type VARCHAR.
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(p,s)
, où p correspond à la precision
et s à l”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¶
L’entrée doit être une expression sous forme de chaîne.
Exemples¶
Ce premier exemple é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 |
+-------------+------+----------------+---------------------+