sql >> Database teknologi >  >> RDS >> SQLite

2 måder at returnere kun de numeriske værdier fra en SQLite-databasekolonne

Følgende SQLite-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
);

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),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

Tabellen er nu oprettet og indeholder følgende data:

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

SQLite bruger et dynamisk type system, hvor datatypen for en værdi er forbundet med selve værdien, ikke kolonnen (som med de fleste andre RDBMS'er). Da jeg oprettede tabellen, specificerede jeg ikke en datatype. Derfor kan værdierne være af enhver type.

Typeof() Funktion

Vi kan bruge SQLites typeof() funktion til at filtrere resultaterne til kun numeriske typer (real og integer ):

SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';

Resultat:

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   

Bare for at være klar, her er et eksempel, der udsender datatypen for hver række:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Resultat:

c1          typeof(c1)
----------  ----------
0           integer   
1           integer   
1           integer   
-1          integer   
0.0         real      
73.45       real      
73.45       real      
-73.45      real      
0.246       real      
-3400000.0  real      
0.012       real      
12000.0     real      
Ten         text      
5 Dollars   text      

REGEXP Funktion

Hvis vi har mere specifikke krav, kan vi alternativt bruge REGEXP at sende et regulært udtryk for at returnere kun de værdier, der matcher det givne mønster.

Eksempel:

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

Resultat:

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   

Returner heltal

Hvis vi kun ønsker at returnere heltal, kan vi forenkle forespørgslen på følgende måde:

SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';

Resultat:

c1
--
0 
1 
1 
-1

Dette returnerer også signerede heltal.

Eller vi kunne bruge et regulært udtryk, hvis vores krav er mere specifikke:

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

Resultat:

c1
--
0 
1 
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 REGEXP '[0-9]+';

Resultat:

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
5 Dollars 

  1. PostgreSQL 8.4 giver DML-privilegier på alle tabeller til en rolle

  2. Hurtige tips til reparation og gendannelse af SQL-database uden sikkerhedskopiering

  3. Hvorfor intet output, når PLSQL Anonymous-blok er fuldført?

  4. DateTime2 vs DateTime i SQL Server