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.