- Categorias:
TO_DECIMAL , TO_NUMBER , TO_NUMERIC¶
Converte uma expressão de entrada em um número de ponto fixo. Para a entrada NULL, a saída será NULL.
Estas funções são sinônimas.
- Consulte também:
Sintaxe¶
TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Argumentos¶
Obrigatório:
expr
Uma expressão de um tipo numérico, de caractere ou variante.
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(precision, 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¶
Para a entrada NULL, o resultado é NULL.
Para números de ponto fixo:
Números com escalas diferentes são convertidos adicionando zeros à direita (se a escala precisar ser aumentada) ou reduzindo o número de dígitos fracionários por arredondamento (se a escala precisar ser diminuída).
Observe que as conversões de números de ponto fixo em números de ponto fixo que aumentam a escala podem falhar.
Para números de ponto flutuante:
Os números são convertidos se estiverem dentro do intervalo representável, dada a escala.
A conversão entre números fracionários binários e decimais não é precisa. Isso pode resultar em perda de precisão ou erros fora da faixa.
Valores de infinidade e NaN (não números) resultam em erros de conversão.
As cadeias de caracteres são convertidas como números decimais, inteiros, fracionários ou de ponto flutuante.
Para entrada fracionária, a precisão é deduzida como o número de dígitos após o ponto.
Para entrada de ponto flutuante, a omissão da mantissa ou do expoente é permitida e é interpretada como 0. Assim,
E
é analisado como 0.
Para entrada VARIANT:
Se a variante contiver um ponto fixo ou um valor numérico de ponto flutuante, é realizada uma conversão numérica apropriada.
Se a variante contém uma cadeia de caracteres, é realizada uma conversão da cadeia de caracteres.
Se a variante contém um valor booleano, o resultado é 0 ou 1 (para falso e verdadeiro, correspondentemente).
Se a variante contiver um valor JSON
null
, a saída será NULL.
Exemplos¶
Crie uma tabela com uma coluna VARCHAR, recupere os valores de cadeia de caracteres da tabela e passe esses valores para a função TO_NUMBER com valores precision
e scale
diferentes.
CREATE OR REPLACE TABLE number_conv(expr VARCHAR);
INSERT INTO number_conv VALUES ('12.3456'), ('98.76546');
SELECT expr, TO_NUMBER(expr), TO_NUMBER(expr, 10, 1), TO_NUMBER(expr, 10, 8) FROM number_conv;
A consulta retorna a seguinte saída:
+----------+-----------------+------------------------+------------------------+
| EXPR | TO_NUMBER(EXPR) | TO_NUMBER(EXPR, 10, 1) | TO_NUMBER(EXPR, 10, 8) |
|----------+-----------------+------------------------+------------------------|
| 12.3456 | 12 | 12.3 | 12.34560000 |
| 98.76546 | 99 | 98.8 | 98.76546000 |
+----------+-----------------+------------------------+------------------------+
Tente uma consulta na mesma tabela usando a função TO_NUMBER para retornar um número com precision
de 10
e a escala de 9
.
SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
Com o argumento precision
definido como 10
, o número máximo de dígitos decimais nos resultados é 10. Como ambos os valores na tabela têm dois dígitos antes da vírgula decimal e scale
está definido como 9
, a consulta retorna um erro porque os resultados retornariam 11 dígitos.
100039 (22003): Numeric value '12.3456' is out of range
Use diferentes elementos de formato com a função TO_DECIMAL em uma consulta:
SELECT column1,
TO_DECIMAL(column1, '99.9') as D0,
TO_DECIMAL(column1, '99.9', 9, 5) as D5,
TO_DECIMAL(column1, 'TM9', 9, 5) as TD5
FROM VALUES ('1.0'), ('-12.3'), ('0.0'), ('- 0.1');
A consulta retorna a seguinte saída:
+---------+-----+-----------+-----------+
| COLUMN1 | D0 | D5 | TD5 |
|---------+-----+-----------+-----------|
| 1.0 | 1 | 1.00000 | 1.00000 |
| -12.3 | -12 | -12.30000 | -12.30000 |
| 0.0 | 0 | 0.00000 | 0.00000 |
| - 0.1 | 0 | -0.10000 | -0.10000 |
+---------+-----+-----------+-----------+
A saída mostra que o elemento de formato mínimo de texto TM9
imprime precisamente o número de dígitos na parte fracionária com base na escala especificada. Para obter mais informações, consulte Formatos numéricos de texto mínimo.
Use o elemento de formato X com a função TO_DECIMAL para converter um valor hexadecimal em um valor decimal:
SELECT TO_DECIMAL('ae5', 'XXX');
A consulta retorna a seguinte saída:
+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
| 2789 |
+--------------------------+
O número de dígitos no elemento de formato deve ser igual ou maior que o número de dígitos na expressão. Por exemplo, tente executar a seguinte consulta:
SELECT TO_DECIMAL('ae5', 'XX');
A consulta retorna um erro:
100140 (22007): Can't parse 'ae5' as number with format 'XX'