Categorias:

Funções de conversão

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

Uma versão especial de TO_DECIMAL , TO_NUMBER , TO_NUMERIC que executa a mesma operação de conversão de uma expressão de entrada em um número de ponto fixo, mas tem suporte para tratamento de erros, de modo que a função retorna NULL se a conversão não pode ser realizada.

Estas funções são sinônimas.

Para obter mais informações, consulte Funções de conversão de tratamento de erros.

Sintaxe

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

Argumentos

Obrigatório:

string_expr

Uma expressão do tipo VARCHAR.

Opcional:

format

O modelo de formato SQL usado para analisar a entrada expr e retornar. Para obter mais informações, consulte Modelos de formato SQL.

precision

O número máximo de dígitos decimais no número resultante; de 1 a 38. No Snowflake, a precisão não é utilizada para determinar o número de bytes necessários para armazenar o número e não afeta a eficiência; portanto, o padrão é o máximo (38).

scale

O número de dígitos decimais fracionários (de 0 a precision - 1). 0 indica nenhum dígito fracionário (ou seja, um número inteiro). A escala padrão é 0.

Retornos

A função retorna um valor do tipo NUMBER com os seguintes padrões:

  • Se precision não for especificado, o padrão será 38.

  • Se scale não for especificado, o padrão será 0.

Se a conversão não puder ser realizada ou a entrada for NULL, retornará NULL.

Notas de uso

A entrada deve ser uma expressão de cadeia de caracteres.

Exemplos

O exemplo a seguir falha porque a última coluna (dec_with_range_error) não armazena dígitos significativos suficientes para manter o valor que ela deveria manter:

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

A consulta a seguir é igual à anterior, exceto que usa TRY_TO_DECIMAL em vez de TO_DECIMAL, convertendo o valor fora do intervalo para 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 |
+-------------+-----+----------------+--------------------+

O exemplo a seguir falha porque a cadeia de caracteres de entrada contém um cifrão ($) e uma vírgula para separar grupos de dígitos, não apenas dígitos e pontos decimais. No entanto, o especificador de formato da última coluna não informa à função TO_DECIMAL para esperar o cifrão e a vírgula:

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

A consulta a seguir é igual à anterior, exceto que usa TRY_TO_DECIMAL em vez de TO_DECIMAL, convertendo a entrada para 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 |
+-------------+------+----------------+---------------------+

O exemplo a seguir falha porque a expressão de entrada contém caracteres que não são dígitos:

SELECT column1 AS orig_string,
       TO_DECIMAL(column1) AS num
  FROM VALUES ('aaa');
Copy
100038 (22018): Numeric value 'aaa' is not recognized

A consulta a seguir é igual à anterior, exceto que usa TRY_TO_DECIMAL em vez de TO_DECIMAL, convertendo a entrada para NULL:

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1) AS num
  FROM VALUES ('aaa');
Copy
+-------------+------+
| ORIG_STRING | NUM  |
|-------------+------|
| aaa         | NULL |
+-------------+------+

Você poderá realizar a conversão se especificar o elemento de formato X com a função TO_DECIMAL ou TRY_TO_DECIMAL para converter um valor hexadecimal em um decimal:

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

Para exemplos adicionais, consulte TO_DECIMAL , TO_NUMBER , TO_NUMERIC.