sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera bara de numeriska värdena från en PostgreSQL-databaskolumn

Följande PostgreSQL-exempel returnerar endast de rader som har numeriska värden i en given kolumn.

Exempeldata

Låt oss skapa en tabell med exempeldata:

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 har nu skapats och innehåller följande 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

Kolumnen är en varchar(255) kolumn, så den är inte numerisk. Det kan (och innehåller) siffror men dessa lagras som teckendata. Den kan också innehålla godtycklig text (vilket den gör).

Returnera alla numeriska värden

Vi kan använda följande fråga för att returnera alla numeriska värden från tabellen ovan:

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

Returnera heltal

Om vi ​​bara vill returnera heltal kan frågan vara mycket enklare:

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

Resultat:

 c1 
----
 0
 1

Innehåller numeriska data

Om vi ​​vill hitta rader som innehåller numerisk data (även om de också innehåller icke-numeriska data), kan vi göra följande:

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, ~ är en skiftlägeskänslig operator för att matcha det givna reguljära uttrycket. För skiftlägesokänsliga matchningar, använd ~* .

Du kan använda !~ för att returnera alla rader som inte matchar det reguljära uttrycket (och !~* för skiftlägesokänsliga matchningar).

POSIX-teckenklasser

Postgres stöder även POSIX-teckenklasser. Så vi kan använda [:digit:] istället för [0-9] om vi föredrar det.

Exempel:

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

Resultat:

 c1 
----
 0
 1

  1. Få rekordantal för alla tabeller i MySQL-databasen

  2. MySQL COS() Funktion – Returnera cosinus för ett tal i MySQL

  3. Så här fixar du "Konfigurationsalternativet 'Agent XPs' existerar inte" i SQL Server (T-SQL)

  4. Se min presentation om "Optimera Microsoft Access med SQL Server".