Categorias:

Funções de conversão

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:

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

Sintaxe

TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Copy

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;
Copy

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;
Copy

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');
Copy

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');
Copy

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');
Copy

A consulta retorna um erro:

100140 (22007): Can't parse 'ae5' as number with format 'XX'