sql >> Databáze >  >> RDS >> PostgreSQL

Vraťte pouze číselné hodnoty ze sloupce databáze PostgreSQL

Následující příklady PostgreSQL vrátí pouze ty řádky, které mají v daném sloupci číselné hodnoty.

Ukázková data

Vytvořme tabulku s ukázkovými daty:

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; 

Tabulka byla nyní vytvořena a obsahuje následující údaje:

 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 Deset 5 dolarů 

Sloupec je varchar(255) sloupec, takže není číselný. Může (a obsahuje) čísla, ale ty jsou uloženy jako znaková data. Může také obsahovat libovolný text (což obsahuje).

Vrátit všechny číselné hodnoty

K vrácení všech číselných hodnot z výše uvedené tabulky můžeme použít následující dotaz:

SELECT c1
FROM t1 
WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$'; 

Výsledek:

 c1 -------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 ,246 -,34e7 1,2e+4

Vrátit celá čísla

Pokud chceme vrátit pouze celá čísla, dotaz může být mnohem jednodušší:

SELECT c1
FROM t1 
WHERE c1 ~ '^[0-9]+$'; 

Výsledek:

 c1 ---- 0 1

Obsahuje číselná data

Pokud chceme najít řádky, které obsahují číselná data (i když obsahují také nečíselná data), můžeme provést následující:

SELECT c1 
FROM t1 
WHERE c1 ~ '[0-9]+'; 

Výsledek:

 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 dolarů

V PostgreSQL ~ je operátor rozlišující velká a malá písmena pro shodu daného regulárního výrazu. Pro shody bez rozlišení malých a velkých písmen použijte ~* .

Můžete použít !~ vrátit všechny řádky, které neodpovídají regulárnímu výrazu (a !~* pro shody bez rozlišení velkých a malých písmen).

Třídy znaků POSIX

Postgres také podporuje třídy znaků POSIX. Můžeme tedy použít [:digit:] místo [0-9] pokud dáváme přednost.

Příklad:

SELECT c1
FROM t1 
WHERE c1 ~ '^[[:digit:]]?$'; 

Výsledek:

 c1 ---- 0 1

  1. Jak aktualizovat sloupec identity na serveru SQL?

  2. Funkce MySQL TRUNCATE() – Zkrátí číslo na zadaný počet desetinných míst

  3. Vlastní sestavené statistiky

  4. Běžné chyby při migraci databází PostgreSQL z On-Prem na AWS RDS