I PostgreSQL kan du bruge to_number()
funktion til at konvertere en streng til en numerisk værdi.
Mere specifikt konverterer den strengrepræsentationen af et tal til en numerisk værdi.
For eksempel, hvis du har $1,234.50
som en streng kan du bruge to_number()
at konvertere det til et faktisk tal, der bruger det numeriske datatype.
Syntaks
Syntaksen ser sådan ud:
to_number(text, text)
Hvor det første argument er en strengrepræsentation af tallet, og det andet argument definerer den skabelon, som det første argument bruger.
Eksempel
Her er et grundlæggende eksempel at demonstrere.
SELECT to_number('80', '99');
Resultat:
80
I dette tilfælde brugte jeg 99
som skabelon. Hver 9
omtales som et "skabelonmønster". 9
skabelonmønster repræsenterer en cifferposition. Jeg brugte to, fordi jeg ville have begge cifre med.
Her er, hvad der sker, hvis jeg fjerner en af 9
s.
SELECT to_number('80', '9');
Resultat:
8
Så det er vigtigt at inkludere det korrekte antal skabelonmønstre i skabelonen.
Gruppeseparator og decimaltegn
Når du arbejder med større tal og/eller tal med brøksekunder, skal du inkludere skabelonmønstre, der angiver gruppeseparatoren og/eller decimaltegnet.
Der er to måder, du kan gøre dette på.
Den første mulighed er bogstaveligt talt at skrive komma og decimaltegn.
SELECT to_number('7,000.25', '9,999.99');
Resultat:
7000.25
Den anden mulighed er at bruge de lokalitetsbevidste versioner. Disse er G for gruppeseparatoren (tusinderseparator) og D for decimaltegnet.
Så det forrige eksempel kunne omskrives som følger:
SELECT to_number('7,000.25', '9G999D99');
Resultat:
7000.25
Valutasymbol
L
skabelonmønster repræsenterer et lokalitetsbevidst valutasymbol.
SELECT to_number('$7,000.25', 'L9G999D99');
Resultat:
7000.25
Returtype
Returværdien af to_number()
funktionen er numerisk.
Du kan kontrollere returtypen med pg_typeof()
funktion.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Resultat:
numeric
Uventede resultater?
Det er vigtigt at få skabelonen rigtig. Ellers kan du ende med uventede resultater.
Her er et eksempel på, hvad der sker, hvis jeg simpelthen glemmer at inkludere L
skabelonmønster fra det tidligere eksempel.
SELECT to_number('$7,000.25', '9G999D99');
Resultat:
7000
Så fordi jeg glemte at inkludere L
skabelonmønster (for valutaen), dette satte hele skabelonen ude af synkronisering med tallet, hvilket resulterede i G
bliver ignoreret, såvel som D
.
Bare for at være klar, her er den igen sammenlignet med den korrekte skabelon.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Resultat:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() vs cast()
to_number()
funktion leveres hovedsageligt til at håndtere inputformater, der ikke kan konverteres ved simpel casting. Det er derfor generelt unødvendigt for standard numeriske repræsentationer.
Så det første eksempel på denne side kunne være udført ved hjælp af cast()
.
SELECT cast('80' AS NUMERIC);
Resultat:
80
Men vi begynder at løbe ind i problemer, når tingene bliver lidt mere komplekse.
SELECT cast('$7,000.25' AS NUMERIC);
Resultat:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Så to_number()
blev hovedsageligt designet til situationer som denne.
Fuld liste over skabelonmønstre og modifikatorer
Postgres indeholder mange flere skabelonmønstre og modifikatorer.
Disse kan også bruges ved formatering af numeriske værdier (for eksempel ved brug af to_char()
funktion for at returnere en formateret strengrepræsentation af tallet).
Se skabelonmønstre og modifikatorer til numerisk formatering i PostgreSQL for en komplet liste.