Los siguientes ejemplos de SQLite devuelven solo aquellas filas que tienen valores no numéricos en una columna dada.
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 excluir tipos numéricos (real
y integer
) de ser devuelto en la consulta:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Resultado:
c1 --------- Ten 5 Dollars
Aquí hay otro 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
Esto nos muestra que solo las dos últimas filas contienen datos no numéricos (contienen text
datos).
El REGEXP
Función
Otra opción es usar 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultado:
c1 --------- Ten 5 Dollars
Devolver números no enteros
Si solo queremos devolver números no enteros, podemos hacer lo siguiente:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Resultado:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Esto también excluye los 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 NOT REGEXP '^[0-9]+$';
Resultado:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
No contiene datos numéricos
Si queremos encontrar filas que no contengan datos numéricos, podemos hacer lo siguiente:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultado:
c1 --- Ten