sql >> Database >  >> RDS >> SQLite

2 manieren om alleen de numerieke waarden uit een SQLite-databasekolom te retourneren

De volgende SQLite-voorbeelden retourneren alleen die rijen met numerieke waarden in een bepaalde kolom.

Voorbeeldgegevens

Laten we een tabel maken met voorbeeldgegevens:

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;

De tabel is nu aangemaakt en bevat de volgende gegevens:

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 gebruikt een dynamisch type systeem, waarbij het datatype van een waarde is gekoppeld aan de waarde zelf, niet aan de kolom (zoals bij de meeste andere RDBMS'en). Toen ik de tabel maakte, heb ik geen gegevenstype opgegeven. Daarom kunnen de waarden van elk type zijn.

Het Typeof() Functie

We kunnen de functie typeof() van SQLite gebruiken om de resultaten te filteren op alleen numerieke typen (real en integer ):

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

Resultaat:

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

Voor de duidelijkheid, hier is een voorbeeld dat het gegevenstype voor elke rij uitvoert:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Resultaat:

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      

De REGEXP Functie

Als we meer specifieke vereisten hebben, kunnen we ook REGEXP . gebruiken om een ​​reguliere expressie door te geven om alleen die waarden te retourneren die overeenkomen met het gegeven patroon.

Voorbeeld:

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

Resultaat:

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

Gehele getallen retourneren

Als we alleen gehele getallen willen retourneren, kunnen we de query als volgt vereenvoudigen:

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

Resultaat:

c1
--
0 
1 
1 
-1

Dit retourneert ook ondertekende gehele getallen.

Of we kunnen een reguliere expressie gebruiken als onze vereisten specifieker zijn:

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

Resultaat:

c1
--
0 
1 
1 

Bevat numerieke gegevens

Als we rijen willen vinden die numerieke gegevens bevatten (zelfs als ze ook niet-numerieke gegevens bevatten), kunnen we het volgende doen:

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

Resultaat:

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

  1. Sqlite voegt geen gegevens in de 2e tabel in

  2. SQL Server:meerdere rijen combineren in één rij

  3. Op afstand verbinding maken met de Oracle 11g-database

  4. Gebruik FILE_NAME() om de logische bestandsnaam te retourneren voor een gegeven bestands-ID in SQL Server