sql >> Database >  >> RDS >> PostgreSQL

Retourneer alleen de numerieke waarden uit een PostgreSQL-databasekolom

De volgende PostgreSQL-voorbeelden retourneren alleen die rijen met numerieke waarden in een bepaalde kolom.

Voorbeeldgegevens

Laten we een tabel maken met voorbeeldgegevens:

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;

De tabel is nu aangemaakt en bevat de volgende gegevens:

    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

De kolom is een varchar(255) kolom, dus het is niet numeriek. Het kan (en zal) cijfers bevatten, maar deze worden opgeslagen als tekengegevens. Het kan ook willekeurige tekst bevatten (wat het ook doet).

Alle numerieke waarden retourneren

We kunnen de volgende query gebruiken om alle numerieke waarden uit de bovenstaande tabel te retourneren:

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

Resultaat:

   c1   
--------
 0
 1
 +1
 -1
 00.00
 73.45
 +73.45
 -73.45
 .246
 -.34e7
 1.2e+4

Gehele getallen retourneren

Als we alleen gehele getallen willen retourneren, kan de query een stuk eenvoudiger zijn:

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

Resultaat:

 c1 
----
 0
 1

Bevat numerieke gegevens

Als we rijen willen vinden die numerieke gegevens bevatten (zelfs als ze ook niet-numerieke gegevens bevatten), kunnen we het volgende doen:

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

Resultaat:

    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

In PostgreSQL, ~ is een hoofdlettergevoelige operator voor het matchen van de gegeven reguliere expressie. Gebruik voor hoofdletterongevoelige overeenkomsten ~* .

Je kunt !~ . gebruiken om alle rijen te retourneren die niet overeenkomen met de reguliere expressie (en !~* voor niet-hoofdlettergevoelige overeenkomsten).

POSIX-tekenklassen

Postgres ondersteunt ook POSIX-tekenklassen. Dus we kunnen [:digit:] . gebruiken in plaats van [0-9] als we dat liever hebben.

Voorbeeld:

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

Resultaat:

 c1 
----
 0
 1

  1. Opgeslagen Java-procedure versus PL/SQL-opgeslagen procedure

  2. GROUP BY vs ORDER BY

  3. Entity Framework maakt een meervoudige tabelnaam, maar de weergave verwacht een enkelvoudige tabelnaam?

  4. APPLSYSPUB-schema