- Categorias:
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> ] ] )
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');100039 (22003): Numeric value '345.123' is out of rangeA consulta seguinte é a mesma que a anterior, exceto que ela usa
TRY_TO_DECIMAL
em vez deTO_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 | +-------------+-----+----------------+--------------------+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');100038 (22018): Numeric value '$345.12' is not recognizedA consulta seguinte é a mesma que a anterior, exceto que ela usa
TRY_TO_DECIMAL
em vez deTO_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 | +-------------+-----+----------------+---------------------+