SQLite
 sql >> Datenbank >  >> RDS >> SQLite

2 Möglichkeiten, nicht numerische Werte in SQLite zurückzugeben

Die folgenden SQLite-Beispiele geben nur die Zeilen zurück, die nicht numerische Werte in einer bestimmten Spalte enthalten.

Beispieldaten

Lassen Sie uns eine Tabelle mit Beispieldaten erstellen:

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;

Die Tabelle ist nun erstellt und enthält folgende Daten:

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 verwendet ein dynamisches Typsystem, bei dem der Datentyp eines Werts mit dem Wert selbst verknüpft ist, nicht mit der Spalte (wie bei den meisten anderen RDBMS). Als ich die Tabelle erstellt habe, habe ich keinen Datentyp angegeben. Daher können die Werte von jedem Typ sein.

Der Typeof() Funktion

Wir können die typeof()-Funktion von SQLite verwenden, um numerische Typen auszuschließen (real und integer ) nicht in der Abfrage zurückgegeben werden:

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

Ergebnis:

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

Hier ist ein weiteres Beispiel, das den Datentyp für jede Zeile ausgibt:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Ergebnis:

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      

Dies zeigt uns, dass nur die letzten beiden Zeilen nicht-numerische Daten enthalten (sie enthalten text Daten).

Der REGEXP Funktion

Eine weitere Option ist die Verwendung von REGEXP um einen regulären Ausdruck zu übergeben, um nur die Werte zurückzugeben, die dem gegebenen Muster entsprechen.

Beispiel:

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

Ergebnis:

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

Nicht-Ganzzahlen zurückgeben

Wenn wir nur Nicht-Ganzzahlen zurückgeben möchten, können wir Folgendes tun:

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

Ergebnis:

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

Dies schließt auch vorzeichenbehaftete Ganzzahlen aus.

Oder wir könnten einen regulären Ausdruck verwenden, wenn unsere Anforderungen spezifischer sind:

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

Ergebnis:

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

Enthält keine numerischen Daten

Wenn wir Zeilen finden möchten, die keine numerischen Daten enthalten, können wir Folgendes tun:

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

Ergebnis:

c1 
---
Ten