PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как работи функцията to_number() в PostgreSQL

В PostgreSQL можете да използвате to_number() функция за преобразуване на низ в числова стойност.

По-конкретно, той преобразува низовото представяне на число в числова стойност.

Например, ако имате $1,234.50 като низ можете да използвате to_number() за да го преобразувате в действително число, което използва числовото тип данни.

Синтаксис

Синтаксисът е така:

to_number(text, text)

Когато първият аргумент е низово представяне на числото, а вторият аргумент дефинира шаблона, който използва първият аргумент.

Пример

Ето основен пример за демонстрация.

SELECT to_number('80', '99');

Резултат:

80

В този случай използвах 99 като шаблон. Всеки 9 се нарича „шаблонен модел“. 9 шаблонът представлява позиция на цифра. Използвах две, защото исках да бъдат включени и двете цифри.

Ето какво се случва, ако премахна един от 9 с.

SELECT to_number('80', '9');

Резултат:

8

Затова е важно да включите правилния брой шаблони в шаблона.

Групов разделител и десетична точка

Когато работите с по-големи числа и/или числа с дробни секунди, ще трябва да включите шаблони, които определят разделителя на групата и/или десетичната запетая.

Има два начина да направите това.

Първата опция е буквално да напишете запетаята и десетичната запетая.

SELECT to_number('7,000.25', '9,999.99');

Резултат:

7000.25

Втората опция е да използвате версиите, които са наясно с локала. Това са G за разделителя на групата (разделител на хиляди) и D за десетичната запетая.

Така че предишният пример може да бъде пренаписан, както следва:

SELECT to_number('7,000.25', '9G999D99');

Резултат:

7000.25

Символ на валута

L шаблонът представлява символ на валута, наясно с локала.

SELECT to_number('$7,000.25', 'L9G999D99');

Резултат:

7000.25

Тип връщане

Връщаната стойност на to_number() функцията е числова.

Можете да проверите типа на връщането с pg_typeof() функция.

SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));

Резултат:

numeric

Неочаквани резултати?

Важно е шаблонът да е правилен. В противен случай може да получите неочаквани резултати.

Ето пример за това какво се случва, ако просто забравя да включа L шаблонен шаблон от предишния пример.

SELECT to_number('$7,000.25', '9G999D99');

Резултат:

7000

Така че, защото забравих да включа L шаблон на шаблон (за валутата), това извежда целия шаблон от синхрон с числото, което води до G се игнорира, както и D .

Само за да е ясно, ето го отново в сравнение с правилния шаблон.

SELECT 
  to_number('$7,000.25', 'L9G999D99') AS "Right",
  to_number('$7,000.25', '9G999D99') AS "Wrong";

Резултат:

   Right | Wrong
---------+-------
 7000.25 | 7000

to_number() срещу cast()

to_number() функцията се предоставя главно за обработка на входни формати, които не могат да бъдат конвертирани чрез просто прехвърляне. Следователно обикновено не е необходимо за стандартни цифрови представяния.

Така че първият пример на тази страница би могъл да бъде направен с помощта на cast() .

SELECT cast('80' AS NUMERIC);

Резултат:

80

Но започваме да се сблъскваме с проблеми, след като нещата станат малко по-сложни.

SELECT cast('$7,000.25' AS NUMERIC);

Резултат:

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

Така че to_number() е предназначен основно за ситуации като тази.

Пълен списък с шаблони и модификатори

Postgres включва много повече шаблони и модификатори.

Те могат да се използват и при форматиране на числови стойности (например при използване на to_char() функция за връщане на форматирано низово представяне на числото).

Вижте Шаблони и модификатори за числово форматиране в PostgreSQL за пълен списък.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как автоматично да затворя неактивни връзки в PostgreSQL?

  2. Как да броим дните с изключение на неделята между две дати в Postgres?

  3. Как да сравним датите в полетата за дата и час в Postgresql?

  4. Неуспешна инсталация на PostgresSQL:неуспешна инициализация на клъстер на база данни MAC OS

  5. PostgreSQL:НЕ IN спрямо ОСВЕН разлика в производителността (редактирано #2)