sql >> Databasteknik >  >> RDS >> SQLite

2 sätt att returnera bara de numeriska värdena från en SQLite-databaskolumn

Följande SQLite-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
);

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 har nu skapats och innehåller följande 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 använder ett dynamiskt typsystem, där datatypen för ett värde är associerad med själva värdet, inte kolumnen (som med de flesta andra RDBMS). När jag skapade tabellen angav jag ingen datatyp. Därför kan värdena vara av vilken typ som helst.

Typeof() Funktion

Vi kan använda SQLites typeof() funktion för att filtrera resultaten till bara numeriska typer (real och 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   

Bara för att vara tydlig, här är ett exempel som matar ut datatypen för varje rad:

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

Om vi ​​har mer specifika krav kan vi alternativt använda REGEXP för att skicka ett reguljärt uttryck för att returnera bara de värden som matchar det givna mönstret.

Exempel:

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   

Returnera heltal

Om vi ​​bara vill returnera heltal kan vi förenkla frågan på följande sätt:

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

Resultat:

c1
--
0 
1 
1 
-1

Detta returnerar också signerade heltal.

Eller så kan vi använda ett reguljärt uttryck om våra krav är mer specifika:

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

Resultat:

c1
--
0 
1 
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 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. SQL ALTER TABELL för nybörjare

  2. Streama stora resultatuppsättningar med MySQL

  3. MySQL Conditional Insert

  4. Hur väljer man bara de första raderna för varje unikt värde i en kolumn?