Følgende PostgreSQL-eksempler returnerer kun de rækker, der har numeriske værdier i en given kolonne.
Eksempel på data
Lad os oprette en tabel med eksempeldata:
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;
Tabellen er nu oprettet og indeholder følgende data:
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 Ten 5 Dollars
Kolonnen er en varchar(255)
kolonne, så den er ikke numerisk. Det kan (og gør) indeholde tal, men disse gemmes som tegndata. Den kan også indeholde vilkårlig tekst (hvilket den gør).
Returner alle numeriske værdier
Vi kan bruge følgende forespørgsel til at returnere alle numeriske værdier fra ovenstående tabel:
SELECT c1
FROM t1
WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultat:
c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4
Returner heltal
Hvis vi kun ønsker at returnere heltal, kan forespørgslen være meget enklere:
SELECT c1
FROM t1
WHERE c1 ~ '^[0-9]+$';
Resultat:
c1 ---- 0 1
Indeholder numeriske data
Hvis vi ønsker at finde rækker, der indeholder numeriske data (selvom de også indeholder ikke-numeriske data), kan vi gøre følgende:
SELECT c1
FROM t1
WHERE c1 ~ '[0-9]+';
Resultat:
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 Dollars
I PostgreSQL, ~
er en store og små bogstaver til at matche det givne regulære udtryk. Brug ~*
, hvis der ikke skelnes mellem store og små bogstaver .
Du kan bruge !~
for at returnere alle rækker, der ikke matcher det regulære udtryk (og !~*
for store og små bogstaver).
POSIX-karakterklasser
Postgres understøtter også POSIX-tegnklasser. Så vi kan bruge [:digit:]
i stedet for [0-9]
hvis vi foretrækker det.
Eksempel:
SELECT c1
FROM t1
WHERE c1 ~ '^[[:digit:]]?$';
Resultat:
c1 ---- 0 1