Следващите примери за PostgreSQL връщат само онези редове, които имат числови стойности в дадена колона.
Примерни данни
Нека създадем таблица с примерни данни:
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;
Таблицата вече е създадена и съдържа следните данни:
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 Десет 5 доларапредварително>Колоната е
varchar(255)
колона, така че не е числова. Може (и съдържа) числа, но те се съхраняват като данни за знаци. Може също да съдържа произволен текст (което прави).Връщане на всички числови стойности
Можем да използваме следната заявка, за да върнем всички числови стойности от горната таблица:
SELECT c1 FROM t1 WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Резултат:
c1 -------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 .246 -.34e7 1,2e+4Връщане на цели числа
Ако искаме да върнем само цели числа, заявката може да бъде много по-проста:
SELECT c1 FROM t1 WHERE c1 ~ '^[0-9]+$';
Резултат:
c1 ---- 0 1Съдържа числови данни
Ако искаме да намерим редове, които съдържат числови данни (дори и да съдържат нечислови данни), можем да направим следното:
SELECT c1 FROM t1 WHERE c1 ~ '[0-9]+';
Резултат:
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 долараВ PostgreSQL,
~
е оператор, чувствителен към малки и големи букви за съвпадение на дадения регулярен израз. За съвпадения без значение от главни букви използвайте~*
.Можете да използвате
!~
за да върнете всички редове, които не съответстват на регулярния израз (и!~*
за съвпадения без разлика в главните букви).Символни класове POSIX
Postgres също поддържа POSIX символни класове. Така че можем да използваме
[:digit:]
вместо[0-9]
ако предпочитаме.Пример:
SELECT c1 FROM t1 WHERE c1 ~ '^[[:digit:]]?$';
Резултат:
c1 ---- 0 1