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

2 måder at returnere ikke-numeriske værdier i SQLite

Følgende SQLite-eksempler returnerer kun de rækker, der har ikke-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 udelukke numeriske typer (real og integer ) fra at blive returneret i forespørgslen:

SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';

Resultat:

c1       
---------
Ten      
5 Dollars

Her er et andet 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      

Dette viser os, at kun de sidste to rækker indeholder ikke-numeriske data (de indeholder text data).

REGEXP Funktion

En anden mulighed er at 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Resultat:

c1       
---------
Ten      
5 Dollars

Returner ikke-heltal

Hvis vi kun ønsker at returnere ikke-heltal, kan vi gøre følgende:

SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';

Resultat:

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

Dette udelukker også signerede heltal.

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

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

Resultat:

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

Indeholder ikke numeriske data

Hvis vi ønsker at finde rækker, der ikke indeholder nogen numeriske data, kan vi gøre følgende:

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

Resultat:

c1 
---
Ten

  1. Vinduesstyring i Oracle D2k-formularer

  2. Sammenlign kun dag og måned med datofelt i mysql

  3. Aktivering af PostgreSQL-understøttelse i PHP på Mac OS X

  4. Hvordan får man MySQL-databasestørrelse til din database?