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