Catégories :

Fonctions de conversion

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> ] ] )
Copy

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 une valeur de type NUMBER avec les valeurs par défaut suivantes :

  • Si precision n’est pas spécifiée, alors la valeur par défaut est 38.

  • Si scale n’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');
Copy
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');
Copy
+-------------+-----+----------------+--------------------+
| 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');
Copy
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');
Copy
+-------------+------+----------------+---------------------+
| 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');
Copy
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');
Copy
+-------------+------+
| 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');
Copy
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa         |           2730 |               2730 |
+-------------+----------------+--------------------+

Pour d’autres exemples, voir TO_DECIMAL , TO_NUMBER , TO_NUMERIC.