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.