- 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.
Converta um número que usa uma vírgula para separar grupos de dígitos:
SELECT column1,
TO_DECIMAL(column1, '9,999.99', 6, 2) as convert_number
FROM VALUES ('3,741.72');
A consulta retorna a seguinte saída:
+----------+----------------+
| COLUMN1 | CONVERT_NUMBER |
|----------+----------------|
| 3,741.72 | 3741.72 |
+----------+----------------+
Converta um valor de moeda que usa uma vírgula para separar grupos de dígitos:
SELECT column1,
TO_DECIMAL(column1, '$9,999.99', 6, 2) as convert_currency
FROM VALUES ('$3,741.72');
A consulta retorna a seguinte saída:
+-----------+------------------+
| COLUMN1 | CONVERT_CURRENCY |
|-----------+------------------|
| $3,741.72 | 3741.72 |
+-----------+------------------+
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'