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 (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> ] ] )
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 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');
Copy
100039 (22003): Numeric value '345.123' is out of range
Copy

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 |
+-------------+-----+----------------+--------------------+
Copy

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');
Copy
100038 (22018): Numeric value '$345.12' is not recognized
Copy

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, '$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 |
+-------------+-----+----------------+---------------------+
Copy