sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur to_number()-funktionen fungerar i PostgreSQL

I PostgreSQL kan du använda to_number() funktion för att konvertera en sträng till ett numeriskt värde.

Mer specifikt konverterar den strängrepresentationen av ett tal till ett numeriskt värde.

Till exempel, om du har $1,234.50 som en sträng kan du använda to_number() för att konvertera det till ett verkligt tal som använder numeriska datatyp.

Syntax

Syntaxen ser ut så här:

to_number(text, text)

Där det första argumentet är en strängrepresentation av numret och det andra argumentet definierar mallen som det första argumentet använder.

Exempel

Här är ett grundläggande exempel att visa.

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

Resultat:

80

I det här fallet använde jag 99 som mall. Varje 9 kallas ett "mallmönster". 9 mallmönster representerar en sifferposition. Jag använde två, eftersom jag ville att båda siffrorna skulle inkluderas.

Här är vad som händer om jag tar bort en av 9 s.

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

Resultat:

8

Så det är viktigt att inkludera rätt antal mallmönster i mallen.

Gruppavskiljare och decimalkomma

När du arbetar med större siffror och/eller siffror med bråkdelar av sekunder, måste du inkludera mallmönster som anger gruppavgränsaren och/eller decimaltecknet.

Det finns två sätt du kan göra detta på.

Det första alternativet är att bokstavligen skriva ut kommatecken och decimalkomma.

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

Resultat:

7000.25

Det andra alternativet är att använda de språkmedvetna versionerna. Dessa är G för gruppavgränsaren (tusentalsavgränsare) och D för decimalkomma.

Så det föregående exemplet skulle kunna skrivas om enligt följande:

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

Resultat:

7000.25

Valutasymbol

L mallmönster representerar en lokal medveten valutasymbol.

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

Resultat:

7000.25

Returtyp

Returvärdet för to_number() funktionen är numerisk.

Du kan kontrollera returtypen med pg_typeof() funktion.

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

Resultat:

numeric

Oväntade resultat?

Det är viktigt att få mallen rätt. Annars kan du få oväntade resultat.

Här är ett exempel på vad som händer om jag helt enkelt glömmer att inkludera L mallmönster från det tidigare exemplet.

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

Resultat:

7000

Så för att jag glömde inkludera L mallmönster (för valutan), detta satte hela mallen ur synk med numret, vilket resulterade i G ignoreras, liksom D .

Bara för att vara tydlig, här är den igen jämfört med rätt mall.

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() kontra cast()

to_number() Funktionen tillhandahålls huvudsakligen för att hantera indataformat som inte kan konverteras genom enkel casting. Det är därför i allmänhet onödigt för numeriska standardrepresentationer.

Så det första exemplet på den här sidan kunde ha gjorts med cast() .

SELECT cast('80' AS NUMERIC);

Resultat:

80

Men vi börjar stöta på problem när saker och ting blir lite mer komplicerade.

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);

to_number() designades huvudsakligen för situationer som denna.

Fullständig lista över mallmönster och modifierare

Postgres innehåller många fler mallmönster och modifierare.

Dessa kan också användas vid formatering av numeriska värden (till exempel när du använder to_char() funktion för att returnera en formaterad strängrepresentation av numret).

Se Mallmönster och modifierare för numerisk formatering i PostgreSQL för en fullständig lista.


  1. Är det något fel med joins som inte använder JOIN-nyckelordet i SQL eller MySQL?

  2. Hur man minimerar RPO för dina PostgreSQL-databaser med hjälp av punktåterställning

  3. MariaDB JSON_TABLE() Förklarad

  4. ODBC-skalära funktioner för datum och tid i SQL Server (T-SQL-exempel)