- 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¶
Ne fonctionne que pour les expressions de chaîne.
Exemples¶
Les exemples suivants illustrent l’utilisation de TRY_TO_DECIMAL
:
Ce premier exemple échoue, car la dernière colonne (« dec_with_range_error ») ne stocke pas suffisamment de chiffres significatifs pour 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 rangeLa requête suivante est identique à la requête précédente, sauf qu’elle utilise
TRY_TO_DECIMAL
plutôt queTO_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 dollar, pas seulement des chiffres et des décimales, mais le spécificateur de format de la dernière colonne n’indique pas à la fonction
TO_DECIMAL
d’attendre le signe dollar.SELECT column1 AS orig_string, TO_DECIMAL(column1, '$999.00') AS num, TO_DECIMAL(column1, '$999.00', 5, 2) AS num_with_scale, TO_DECIMAL(column1, 5, 2) AS num_with_format_err FROM VALUES ('$345.12');100038 (22018): Numeric value '$345.12' is not recognizedLa requête suivante est identique à la requête précédente, sauf qu’elle utilise
TRY_TO_DECIMAL
plutôt queTO_DECIMAL
, de sorte qu’elle convertisse l’entrée en NULL.SELECT column1 AS orig_string, TRY_TO_DECIMAL(column1, '$999.00') AS num, TRY_TO_DECIMAL(column1, '$999.00', 5, 2) AS num_with_scale, TRY_TO_DECIMAL(column1, 5, 2) AS num_with_format_err FROM VALUES ('$345.12'); +-------------+-----+----------------+---------------------+ | ORIG_STRING | NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR | |-------------+-----+----------------+---------------------| | $345.12 | 345 | 345.12 | NULL | +-------------+-----+----------------+---------------------+