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

2 modi per restituire valori non numerici in SQLite

I seguenti esempi di SQLite restituiscono solo quelle righe che hanno valori non numerici in una determinata colonna.

Dati di esempio

Creiamo una tabella con dati di esempio:

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;

La tabella è stata ora creata e contiene i seguenti dati:

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 utilizza un sistema di tipi dinamici, in cui il tipo di dati di un valore è associato al valore stesso, non alla colonna (come con la maggior parte degli altri RDBMS). Quando ho creato la tabella, non ho specificato un tipo di dati. Pertanto, i valori possono essere di qualsiasi tipo.

Il Typeof() Funzione

Possiamo usare la funzione typeof() di SQLite per escludere i tipi numerici (real e integer ) dalla restituzione nella query:

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

Risultato:

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

Ecco un altro esempio che restituisce il tipo di dati per ogni riga:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Risultato:

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      

Questo ci mostra che solo le ultime due righe contengono dati non numerici (contengono text dati).

Il REGEXP Funzione

Un'altra opzione è usare REGEXP per passare un'espressione regolare per restituire solo quei valori che corrispondono al modello dato.

Esempio:

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

Risultato:

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

Restituisce non interi

Se vogliamo restituire solo numeri non interi, possiamo fare quanto segue:

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

Risultato:

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

Ciò esclude anche gli interi con segno.

Oppure potremmo usare un'espressione regolare se i nostri requisiti sono più specifici:

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

Risultato:

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

Non contiene dati numerici

Se vogliamo trovare righe che non contengono dati numerici, possiamo fare quanto segue:

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

Risultato:

c1 
---
Ten