Následující příklady PostgreSQL vrátí pouze ty řádky, které mají v daném sloupci číselné hodnoty.
Ukázková data
Vytvořme tabulku s ukázkovými daty:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1 varchar(255)
);
INSERT INTO t1 (c1) VALUES
('0'),
('1'),
('+1'),
('-1'),
('00.00'),
('73.45'),
('+73.45'),
('-73.45'),
('.246'),
('-.34e7'),
('12.e-3'),
('1.2e+4'),
('a'),
('9afc'),
('e7'),
('+e0'),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
Tabulka byla nyní vytvořena a obsahuje následující údaje:
c1 ----------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 ,246 -,34e7 12,e-3 1,2e+4 a 9afc e7 +e0 Deset 5 dolarůSloupec je
varchar(255)
sloupec, takže není číselný. Může (a obsahuje) čísla, ale ty jsou uloženy jako znaková data. Může také obsahovat libovolný text (což obsahuje).Vrátit všechny číselné hodnoty
K vrácení všech číselných hodnot z výše uvedené tabulky můžeme použít následující dotaz:
SELECT c1 FROM t1 WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Výsledek:
c1 -------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 ,246 -,34e7 1,2e+4Vrátit celá čísla
Pokud chceme vrátit pouze celá čísla, dotaz může být mnohem jednodušší:
SELECT c1 FROM t1 WHERE c1 ~ '^[0-9]+$';
Výsledek:
c1 ---- 0 1Obsahuje číselná data
Pokud chceme najít řádky, které obsahují číselná data (i když obsahují také nečíselná data), můžeme provést následující:
SELECT c1 FROM t1 WHERE c1 ~ '[0-9]+';
Výsledek:
c1 ----------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 ,246 -,34e7 12,e-3 1,2e+4 9afc e7 +e0 5 dolarůV PostgreSQL
~
je operátor rozlišující velká a malá písmena pro shodu daného regulárního výrazu. Pro shody bez rozlišení malých a velkých písmen použijte~*
.Můžete použít
!~
vrátit všechny řádky, které neodpovídají regulárnímu výrazu (a!~*
pro shody bez rozlišení velkých a malých písmen).Třídy znaků POSIX
Postgres také podporuje třídy znaků POSIX. Můžeme tedy použít
[:digit:]
místo[0-9]
pokud dáváme přednost.Příklad:
SELECT c1 FROM t1 WHERE c1 ~ '^[[:digit:]]?$';
Výsledek:
c1 ---- 0 1