sql >> Databasteknik >  >> RDS >> SQLite

2 sätt att returnera icke-numeriska värden i SQLite

Följande SQLite-exempel returnerar endast de rader som har icke-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 utesluta numeriska typer (real och integer ) från att returneras i frågan:

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

Resultat:

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

Här är ett annat 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      

Detta visar oss att endast de två sista raderna innehåller icke-numeriska data (de innehåller text data).

REGEXP Funktion

Ett annat alternativ är att 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Resultat:

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

Returnera icke-heltal

Om vi ​​bara vill returnera icke-heltal kan vi göra följande:

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 

Detta exkluderar också heltal med tecken.

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

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 

Innehåller inte numerisk data

Om vi ​​vill hitta rader som inte innehåller några numeriska data kan vi göra följande:

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

Resultat:

c1 
---
Ten

  1. Full förståelse för PDO ATTR_PERSISTENT

  2. Fråga timeout i pg-promise

  3. Hur kan jag fylla en kolumn med slumptal i SQL? Jag får samma värde i varje rad

  4. Hur man arbetar med arv i Entity Framework Core