sql >> Database teknologi >  >> RDS >> PostgreSQL

Returner kun de numeriske værdier fra en PostgreSQL-databasekolonne

Følgende PostgreSQL-eksempler returnerer kun de rækker, der har numeriske værdier i en given kolonne.

Eksempel på data

Lad os oprette en tabel med eksempeldata:

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;

Tabellen er nu oprettet og indeholder følgende data:

    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

Kolonnen er en varchar(255) kolonne, så den er ikke numerisk. Det kan (og gør) indeholde tal, men disse gemmes som tegndata. Den kan også indeholde vilkårlig tekst (hvilket den gør).

Returner alle numeriske værdier

Vi kan bruge følgende forespørgsel til at returnere alle numeriske værdier fra ovenstående tabel:

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

Resultat:

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

Returner heltal

Hvis vi kun ønsker at returnere heltal, kan forespørgslen være meget enklere:

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

Resultat:

 c1 
----
 0
 1

Indeholder numeriske data

Hvis vi ønsker at finde rækker, der indeholder numeriske data (selvom de også indeholder ikke-numeriske data), kan vi gøre følgende:

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

Resultat:

    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

I PostgreSQL, ~ er en store og små bogstaver til at matche det givne regulære udtryk. Brug ~*, hvis der ikke skelnes mellem store og små bogstaver .

Du kan bruge !~ for at returnere alle rækker, der ikke matcher det regulære udtryk (og !~* for store og små bogstaver).

POSIX-karakterklasser

Postgres understøtter også POSIX-tegnklasser. Så vi kan bruge [:digit:] i stedet for [0-9] hvis vi foretrækker det.

Eksempel:

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

Resultat:

 c1 
----
 0
 1

  1. Hvordan tilføjer jeg en auto_increment primær nøgle i SQL Server-databasen?

  2. Opsæt database og opret en skrivebeskyttet bruger i AWS Redshift og Mysql

  3. Brug af MySQL med Entity Framework

  4. Sådan sender du en POST-anmodning med formulardata og parametre i PL/SQL