W PostgreSQL możesz użyć to_number()
funkcja do konwersji ciągu na wartość liczbową.
Dokładniej, konwertuje ciąg reprezentujący liczbę na wartość liczbową.
Na przykład, jeśli masz $1,234.50
jako ciąg, możesz użyć to_number()
aby przekonwertować to na rzeczywistą liczbę, która używa liczby typ danych.
Składnia
Składnia wygląda tak:
to_number(text, text)
Gdzie pierwszy argument jest ciągiem reprezentującym liczbę, a drugi argument definiuje szablon, którego używa pierwszy argument.
Przykład
Oto podstawowy przykład do zademonstrowania.
SELECT to_number('80', '99');
Wynik:
80
W tym przypadku użyłem 99
jako szablon. Każdy 9
jest określany jako „wzorzec szablonu”. 9
wzór szablonu reprezentuje pozycję cyfry. Użyłem dwóch, ponieważ chciałem, aby zawierały obie cyfry.
Oto, co się stanie, jeśli usunę jeden z 9
s.
SELECT to_number('80', '9');
Wynik:
8
Dlatego ważne jest, aby w szablonie zawrzeć odpowiednią liczbę wzorów szablonów.
Separator grupy i punkt dziesiętny
Pracując z większymi liczbami i/lub liczbami z ułamkami sekund, musisz uwzględnić wzorce szablonów, które określają separator grup i/lub kropkę dziesiętną.
Można to zrobić na dwa sposoby.
Pierwszą opcją jest dosłownie wpisanie przecinka i kropki dziesiętnej.
SELECT to_number('7,000.25', '9,999.99');
Wynik:
7000.25
Drugą opcją jest użycie wersji uwzględniających lokalizację. Są to G dla separatora grup (separator tysięcy) i D dla kropki dziesiętnej.
Zatem poprzedni przykład można przepisać w następujący sposób:
SELECT to_number('7,000.25', '9G999D99');
Wynik:
7000.25
Symbol waluty
L
wzorzec szablonu reprezentuje symbol waluty uwzględniający ustawienia regionalne.
SELECT to_number('$7,000.25', 'L9G999D99');
Wynik:
7000.25
Typ zwrotu
Zwracana wartość funkcji to_number()
funkcja jest numeryczna.
Możesz sprawdzić typ zwracany za pomocą pg_typeof()
funkcja.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Wynik:
numeric
Nieoczekiwane wyniki?
Ważne jest, aby szablon był prawidłowy. W przeciwnym razie możesz uzyskać nieoczekiwane wyniki.
Oto przykład tego, co się stanie, jeśli po prostu zapomnę dodać L
wzór szablonu z wcześniejszego przykładu.
SELECT to_number('$7,000.25', '9G999D99');
Wynik:
7000
Więc ponieważ zapomniałem dołączyć L
wzorzec szablonu (dla waluty), to spowodowało brak synchronizacji całego szablonu z numerem, co skutkowało G
ignorowane, a także D
.
Żeby było jasne, to znowu w porównaniu z poprawnym szablonem.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Wynik:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() a cast()
to_number()
funkcja służy głównie do obsługi formatów wejściowych, których nie można przekonwertować przez proste rzutowanie. Dlatego generalnie nie jest konieczne w przypadku standardowych reprezentacji liczbowych.
Więc pierwszy przykład na tej stronie można było wykonać za pomocą cast()
.
SELECT cast('80' AS NUMERIC);
Wynik:
80
Ale zaczynamy wpadać w kłopoty, gdy sytuacja staje się nieco bardziej skomplikowana.
SELECT cast('$7,000.25' AS NUMERIC);
Wynik:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Więc to_number()
został zaprojektowany głównie z myślą o sytuacjach takich jak ta.
Pełna lista wzorców i modyfikatorów szablonów
Postgres zawiera znacznie więcej szablonów i modyfikatorów.
Można ich również używać podczas formatowania wartości numerycznych (na przykład przy użyciu funkcji to_char()
funkcja zwracająca sformatowany ciąg reprezentujący liczbę).
Zobacz Wzorce i modyfikatory szablonów do formatowania liczb w PostgreSQL, aby uzyskać pełną listę.