В 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 за пълен списък.