PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Върнете само числовите стойности от колона на PostgreSQL база данни

Следващите примери за 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли удар в производителността при използване на десетични типове данни (MySQL / Postgres)

  2. Инструмент за превод на Oracle PL/SQL в Postgresql PL/pgSQL

  3. не може да изтрие обект поради ограничение на външния ключ

  4. Как да свързвам SQL променливи в PHP?

  5. Postgres - Функция за връщане на пресечната точка на 2 МАССИВА?