Poniższe przykłady PostgreSQL zwracają tylko te wiersze, które mają wartości liczbowe w danej kolumnie.
Przykładowe dane
Stwórzmy tabelę z przykładowymi danymi:
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;
Tabela została utworzona i zawiera następujące dane:
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
Kolumna to varchar(255)
kolumna, więc nie jest liczbowa. Może (i zawiera) liczby, ale są one przechowywane jako dane znakowe. Może również zawierać dowolny tekst (co robi).
Zwróć wszystkie wartości liczbowe
Możemy użyć następującego zapytania, aby zwrócić wszystkie wartości liczbowe z powyższej tabeli:
SELECT c1
FROM t1
WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Wynik:
c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4
Zwracane liczby całkowite
Jeśli chcemy zwrócić tylko liczby całkowite, zapytanie może być dużo prostsze:
SELECT c1
FROM t1
WHERE c1 ~ '^[0-9]+$';
Wynik:
c1 ---- 0 1
Zawiera dane liczbowe
Jeśli chcemy znaleźć wiersze zawierające dane liczbowe (nawet jeśli zawierają również dane nieliczbowe), możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE c1 ~ '[0-9]+';
Wynik:
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
W PostgreSQL ~
jest operatorem rozróżniającym wielkość liter dla dopasowania podanego wyrażenia regularnego. W przypadku dopasowań bez rozróżniania wielkości liter użyj ~*
.
Możesz użyć !~
aby zwrócić wszystkie wiersze, które nie pasują do wyrażenia regularnego (i !~*
dla dopasowań bez rozróżniania wielkości liter).
Klasy znaków POSIX
Postgres obsługuje również klasy znaków POSIX. Możemy więc użyć [:digit:]
zamiast [0-9]
jeśli wolimy.
Przykład:
SELECT c1
FROM t1
WHERE c1 ~ '^[[:digit:]]?$';
Wynik:
c1 ---- 0 1