sql >> Databáze >  >> RDS >> PostgreSQL

Jak funguje funkce to_number() v PostgreSQL

V PostgreSQL můžete použít to_number() funkce pro převod řetězce na číselnou hodnotu.

Přesněji řečeno, převádí řetězcovou reprezentaci čísla na číselnou hodnotu.

Pokud máte například $1,234.50 jako řetězec můžete použít to_number() převést to na skutečné číslo, které používá číselné datový typ.

Syntaxe

Syntaxe vypadá takto:

to_number(text, text)

Kde první argument je řetězcová reprezentace čísla a druhý argument definuje šablonu, kterou první argument používá.

Příklad

Zde je základní příklad k demonstraci.

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

Výsledek:

80

V tomto případě jsem použil 99 jako šablonu. Každý 9 se označuje jako „vzor šablony“. 9 vzor šablony představuje pozici číslice. Použil jsem dvě, protože jsem chtěl, aby byly zahrnuty obě číslice.

Zde je to, co se stane, když odstraním jeden z 9 s.

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

Výsledek:

8

Je tedy důležité zahrnout do šablony správný počet vzorů šablony.

Oddělovač skupiny a desetinná tečka

Při práci s většími čísly a/nebo čísly se zlomky sekund budete muset zahrnout vzory šablon, které určují oddělovač skupiny a/nebo desetinnou čárku.

Můžete to udělat dvěma způsoby.

První možností je doslova napsat čárku a desetinnou čárku.

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

Výsledek:

7000.25

Druhou možností je použití verzí s ohledem na národní prostředí. Jsou to G pro oddělovač skupin (oddělovač tisíců) a D pro desetinnou čárku.

Takže předchozí příklad by mohl být přepsán následovně:

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

Výsledek:

7000.25

Symbol měny

L vzor šablony představuje symbol měny s vědomím národního prostředí.

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

Výsledek:

7000.25

Typ návratu

Vrácená hodnota to_number() funkce je číselná.

Návratový typ můžete zkontrolovat pomocí pg_typeof() funkce.

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

Výsledek:

numeric

Neočekávané výsledky?

Je důležité mít správnou šablonu. Jinak byste mohli skončit s neočekávanými výsledky.

Zde je příklad toho, co se stane, když jednoduše zapomenu uvést L vzor šablony z předchozího příkladu.

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

Výsledek:

7000

Takže protože jsem zapomněl zahrnout L vzor šablony (pro měnu), tím byla celá šablona nesynchronizovaná s číslem, což vedlo k G je ignorován, stejně jako D .

Jen pro upřesnění, tady je to znovu ve srovnání se správnou šablonou.

SELECT 
  to_number('$7,000.25', 'L9G999D99') AS "Right",
  to_number('$7,000.25', '9G999D99') AS "Wrong";

Výsledek:

   Right | Wrong
---------+-------
 7000.25 | 7000

to_number() vs cast()

to_number() funkce je poskytována hlavně pro zpracování vstupních formátů, které nelze převést jednoduchým přetypováním. Pro standardní numerické reprezentace je to tedy obecně zbytečné.

Takže první příklad na této stránce mohl být proveden pomocí cast() .

SELECT cast('80' AS NUMERIC);

Výsledek:

80

Ale jakmile se věci trochu zkomplikují, začneme se dostávat do problémů.

SELECT cast('$7,000.25' AS NUMERIC);

Výsledek:

ERROR: invalid input syntax for type numeric: "$7,000.25"
LINE 1: SELECT cast('$7,000.25' AS NUMERIC);

Takže to_number() byl navržen hlavně pro situace, jako je tato.

Úplný seznam vzorů a modifikátorů šablon

Postgres obsahuje mnohem více šablon a modifikátorů.

Lze je také použít při formátování číselných hodnot (například při použití to_char() funkce, která vrátí formátovanou řetězcovou reprezentaci čísla).

Úplný seznam viz Vzory šablon a modifikátory pro číselné formátování v PostgreSQL.


  1. Události čekání serveru SQL -2

  2. Kontrola a optimalizace databáze MySQL automaticky pomocí Crontab/Cron

  3. Jaký je rozdíl mezi char, nchar, varchar a nvarchar na serveru SQL?

  4. SQL Server 2016:Vylepšení skupiny dostupnosti