sql >> Base de Datos >  >> RDS >> SQLite

2 formas de devolver solo los valores numéricos de una columna de base de datos SQLite

Los siguientes ejemplos de SQLite devuelven solo aquellas filas que tienen valores numéricos en una columna determinada.

Datos de muestra

Vamos a crear una tabla con datos de muestra:

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 tabla ahora se ha creado y contiene los siguientes datos:

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 usa un sistema de tipo dinámico, donde el tipo de datos de un valor está asociado con el valor en sí, no con la columna (como ocurre con la mayoría de los otros RDBMS). Cuando creé la tabla, no especifiqué un tipo de datos. Por lo tanto, los valores pueden ser de cualquier tipo.

El Typeof() Función

Podemos usar la función typeof() de SQLite para filtrar los resultados a solo tipos numéricos (real y integer ):

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

Resultado:

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

Para que quede claro, aquí hay un ejemplo que genera el tipo de datos para cada fila:

SELECT 
    c1,
    typeof(c1)
FROM t1;

Resultado:

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      

El REGEXP Función

Si tenemos requisitos más específicos, podemos usar alternativamente REGEXP para pasar una expresión regular para devolver solo aquellos valores que coincidan con el patrón dado.

Ejemplo:

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

Resultado:

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

Devolver enteros

Si solo queremos devolver números enteros, podemos simplificar la consulta de la siguiente manera:

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

Resultado:

c1
--
0 
1 
1 
-1

Esto también devuelve enteros con signo.

O podríamos usar una expresión regular si nuestros requisitos son más específicos:

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

Resultado:

c1
--
0 
1 
1 

Contiene datos numéricos

Si queremos encontrar filas que contengan datos numéricos (incluso si también contienen datos no numéricos), podemos hacer lo siguiente:

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

Resultado:

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