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 realiza a mesma operação (ou seja, converte uma expressão de entrada em um número de ponto fixo), mas com suporte para tratamento de erros (ou seja, se a conversão não puder ser realizada, retorna um valor NULL em vez de acusar um erro).

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 tem qualquer efeito sobre 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 NUMBER(p,s), onde p é o precision e s é o scale.

Se precision não for especificado, então o padrão é 38.

Se scale não for especificado, então o padrão é 0.

Notas de uso

  • Funciona apenas para expressões de cadeia de caracteres.

Exemplos

Os exemplos a seguir demonstram o uso de TRY_TO_DECIMAL:

Este primeiro exemplo falha porque a última coluna (“dec_with_range_error”) não armazena dígitos significativos o suficiente para manter o valor que lhe é pedido para 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
Copy

A consulta seguinte é a mesma que a anterior, exceto que ela usa TRY_TO_DECIMAL em vez de TO_DECIMAL, portanto, converte o valor fora da faixa 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');
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123     | 345 |         345.12 |               NULL |
+-------------+-----+----------------+--------------------+
Copy

O exemplo seguinte falha porque a cadeia de caracteres de entrada contém um sinal de cifrão, não apenas dígitos e pontos decimais, mas o especificador de formato para a última coluna não informa a função TO_DECIMAL para esperar o sinal de cifrão.

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

A consulta seguinte é a mesma que a anterior, exceto que ela usa TRY_TO_DECIMAL em vez de TO_DECIMAL, portanto, converte a entrada para 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