In PostgreSQL kunt u de to_number()
. gebruiken functie om een string om te zetten in een numerieke waarde.
Meer specifiek converteert het de tekenreeksrepresentatie van een getal naar een numerieke waarde.
Als u bijvoorbeeld $1,234.50
. heeft als een tekenreeks kunt u to_number()
. gebruiken om dat om te zetten in een echt getal dat de numerieke . gebruikt gegevenstype.
Syntaxis
De syntaxis gaat als volgt:
to_number(text, text)
Waar het eerste argument een tekenreeksrepresentatie van het getal is, en het tweede argument de sjabloon definieert die door het eerste argument wordt gebruikt.
Voorbeeld
Hier is een eenvoudig voorbeeld om te demonstreren.
SELECT to_number('80', '99');
Resultaat:
80
In dit geval gebruikte ik 99
als de sjabloon. Elke 9
wordt een "sjabloonpatroon" genoemd. De 9
sjabloonpatroon vertegenwoordigt een cijferpositie. Ik heb er twee gebruikt, omdat ik beide cijfers wilde opnemen.
Dit gebeurt er als ik een van de 9
. verwijder v.
SELECT to_number('80', '9');
Resultaat:
8
Het is dus belangrijk om het juiste aantal sjabloonpatronen in de sjabloon op te nemen.
Groepsscheidingsteken en decimale punt
Als u met grotere getallen en/of getallen met breuken in seconden werkt, moet u sjabloonpatronen opnemen die het groepsscheidingsteken en/of de decimale punt specificeren.
U kunt dit op twee manieren doen.
De eerste optie is om letterlijk de komma en de komma in te typen.
SELECT to_number('7,000.25', '9,999.99');
Resultaat:
7000.25
De tweede optie is om de locale-aware versies te gebruiken. Dit zijn G voor het groepsscheidingsteken (scheidingsteken voor duizenden) en D voor de komma.
Het vorige voorbeeld kan dus als volgt worden herschreven:
SELECT to_number('7,000.25', '9G999D99');
Resultaat:
7000.25
Valutasymbool
De L
sjabloonpatroon vertegenwoordigt een locale bewust valutasymbool.
SELECT to_number('$7,000.25', 'L9G999D99');
Resultaat:
7000.25
Retourtype
De retourwaarde van de to_number()
functie is numeriek.
U kunt het retourtype controleren met de pg_typeof()
functie.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Resultaat:
numeric
Onverwachte resultaten?
Het is belangrijk om de sjabloon goed te krijgen. Anders kunt u onverwachte resultaten krijgen.
Hier is een voorbeeld van wat er gebeurt als ik gewoon vergeet de L
. op te nemen sjabloonpatroon uit het eerdere voorbeeld.
SELECT to_number('$7,000.25', '9G999D99');
Resultaat:
7000
Dus omdat ik vergat de L
. op te nemen sjabloonpatroon (voor de valuta), hierdoor liep het hele sjabloon niet synchroon met het nummer, wat resulteerde in de G
wordt genegeerd, evenals de D
.
Voor de duidelijkheid, hier is het weer in vergelijking met de juiste sjabloon.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Resultaat:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() vs cast()
De to_number()
functie is voornamelijk bedoeld om invoerformaten te verwerken die niet kunnen worden geconverteerd door eenvoudig te casten. Het is daarom over het algemeen niet nodig voor standaard numerieke representaties.
Dus het eerste voorbeeld op deze pagina had kunnen worden gedaan met cast()
.
SELECT cast('80' AS NUMERIC);
Resultaat:
80
Maar zodra de zaken wat ingewikkelder worden, komen we in de problemen.
SELECT cast('$7,000.25' AS NUMERIC);
Resultaat:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Dus to_number()
is voornamelijk ontworpen voor situaties zoals deze.
Volledige lijst met sjabloonpatronen en -modificaties
Postgres bevat nog veel meer sjabloonpatronen en modifiers.
Deze kunnen ook worden gebruikt bij het opmaken van numerieke waarden (bijvoorbeeld bij het gebruik van de to_char()
functie om een opgemaakte tekenreeksrepresentatie van het getal terug te geven).
Zie Sjabloonpatronen en -modificaties voor numerieke opmaak in PostgreSQL voor een volledige lijst.