PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como a função to_number() funciona no PostgreSQL


No PostgreSQL, você pode usar o to_number() função para converter uma string em um valor numérico.

Mais especificamente, ele converte a representação de string de um número em um valor numérico.

Por exemplo, se você tiver $1,234.50 como uma string, você pode usar to_number() para converter isso em um número real que usa o numérico tipo de dados.

Sintaxe


A sintaxe fica assim:
to_number(text, text)

Onde o primeiro argumento é uma representação de string do número e o segundo argumento define o modelo que o primeiro argumento usa.

Exemplo


Aqui está um exemplo básico para demonstrar.
SELECT to_number('80', '99');

Resultado:
80

Nesse caso, usei 99 como o modelo. Cada 9 é referido como um "padrão de modelo". O 9 padrão de modelo representa uma posição de dígito. Usei dois, porque queria que os dois dígitos fossem incluídos.

Veja o que acontece se eu remover um dos 9 s.
SELECT to_number('80', '9');

Resultado:
8

Portanto, é importante incluir o número correto de padrões de modelo no modelo.

Separador de grupo e ponto decimal


Ao trabalhar com números maiores e/ou números com segundos fracionários, você precisará incluir padrões de modelo que especifiquem o separador de grupo e/ou o ponto decimal.

Há duas maneiras de você fazer isto.

A primeira opção é digitar literalmente a vírgula e o ponto decimal.
SELECT to_number('7,000.25', '9,999.99');

Resultado:
7000.25

A segunda opção é usar as versões com reconhecimento de localidade. Estes são G para o separador de grupo (separador de milhares) e D para o ponto decimal.

Assim, o exemplo anterior poderia ser reescrito da seguinte forma:
SELECT to_number('7,000.25', '9G999D99');

Resultado:
7000.25

Símbolo de moeda


O L padrão de modelo representa um símbolo de moeda com reconhecimento de localidade.
SELECT to_number('$7,000.25', 'L9G999D99');

Resultado:
7000.25

Tipo de retorno


O valor de retorno do to_number() função é numérica.

Você pode verificar o tipo de retorno com o pg_typeof() função.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));

Resultado:
numeric

Resultados inesperados?


É importante acertar o modelo. Caso contrário, você pode acabar com resultados inesperados.

Aqui está um exemplo do que acontece se eu simplesmente esquecer de incluir o L padrão de modelo do exemplo anterior.
SELECT to_number('$7,000.25', '9G999D99');

Resultado:
7000

Então, porque eu esqueci de incluir o L padrão de modelo (para a moeda), isso dessincronizou todo o modelo com o número, o que resultou no G sendo ignorado, assim como o D .

Só para ficar claro, aqui está novamente quando comparado ao modelo correto.
SELECT 
  to_number('$7,000.25', 'L9G999D99') AS "Right",
  to_number('$7,000.25', '9G999D99') AS "Wrong";

Resultado:
   Right | Wrong
---------+-------
 7000.25 | 7000

to_number() vs cast()


O to_number() A função é fornecida principalmente para lidar com formatos de entrada que não podem ser convertidos por conversão simples. Portanto, geralmente é desnecessário para representações numéricas padrão.

Então o primeiro exemplo nesta página poderia ter sido feito usando cast() .
SELECT cast('80' AS NUMERIC);

Resultado:
80

Mas começamos a ter problemas quando as coisas ficam um pouco mais complexas.
SELECT cast('$7,000.25' AS NUMERIC);

Resultado:
ERROR: invalid input syntax for type numeric: "$7,000.25"
LINE 1: SELECT cast('$7,000.25' AS NUMERIC);

Então to_number() foi projetado principalmente para situações como esta.

Lista completa de padrões e modificadores de modelo


O Postgres inclui muito mais padrões e modificadores de template.

Eles também podem ser usados ​​ao formatar valores numéricos (por exemplo, ao usar o to_char() para retornar uma representação de string formatada do número).

Consulte Padrões e modificadores de modelo para formatação numérica no PostgreSQL para obter uma lista completa.