- Categorias:
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> ] ] )
Argumentos¶
Obrigatório:
string_exprUma expressão do tipo VARCHAR.
Opcional:
formatO modelo de formato SQL usado para analisar a entrada
expre retornar. Para obter mais informações, consulte Modelos de formato SQL.precisionO 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).
scaleO 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
precisionnão for especificado, o padrão será 38.Se
scalenã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');
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');
+-------------+-----+----------------+--------------------+
| 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');
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');
+-------------+------+----------------+---------------------+
| 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');
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');
+-------------+------+
| 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');
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa | 2730 | 2730 |
+-------------+----------------+--------------------+
Para exemplos adicionais, consulte TO_DECIMAL , TO_NUMBER , TO_NUMERIC.