PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zwróć tylko wartości liczbowe z kolumny bazy danych PostgreSQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić funkcję, procedurę, kod źródłowy wyzwalaczy w postgresql?

  2. Jak używać dynamicznych nazw kolumn w instrukcji UPDATE lub SELECT w funkcji?

  3. jak emulować ignorowanie wstawiania i aktualizację zduplikowanych kluczy (sql merge) za pomocą postgresql?

  4. Jaka jest maksymalna liczba dozwolonych parametrów na typ dostawcy bazy danych?

  5. ustaw puste hasło dla użytkownika PostgreSQL