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.