¿Hay alguna manera de detectar si un valor es un número en una consulta MySQL? Como
SELECT *
FROM myTable
WHERE isANumber(col1) = true
¿Hay alguna manera de detectar si un valor es un número en una consulta MySQL? Como
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Respuestas:
Esto debería funcionar en la mayoría de los casos.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
No funciona para números no estándar como
1e4
1.2e5
123.
(decimal final)También puedes usar Expresión regular ... sería como:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Referencia: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
y para el caso de que pueda tener un punto decimal, use regex:^[0-9\.]+$
Si sus datos son 'test', 'test0', 'test1111', '111test', '111'
Para seleccionar todos los registros donde los datos son un int simple:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Resultado: '111'
(En regex, ^ significa comenzar y $ significa fin)
Para seleccionar todos los registros donde existe un número entero o decimal:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Resultado: '111' (igual que el último ejemplo)
Finalmente, para seleccionar todos los registros donde existe un número, use esto:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Resultado: 'test0' y 'test1111' y '111test' y '111'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
También coincidirá con decimales firmados (como -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Prueba:
drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1)
values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');
select
col1,
col1 + 0 as casted,
col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Resultado:
col1 | casted | isNumeric
-------|---------|----------
00.00 | 0 | 1
+1 | 1 | 1
.123 | 0.123 | 1
-.23e4 | -2300 | 1
12.e-5 | 0.00012 | 1
3.5e+6 | 3500000 | 1
a | 0 | 0
e6 | 0 | 0
+e0 | 0 | 0
Devuelve filas numéricas
Encontré la solución con la siguiente consulta y funciona para mí:
SELECT * FROM myTable WHERE col1 > 0;
Esta consulta devuelve filas que solo tienen una columna de número mayor que cero que col1
Devuelve filas no numéricas
si quieres verificar la columna no numérica prueba esta con el truco ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
consulta devolverá filas, incluso el valor de col es123abc
use un UDF (función definida por el usuario).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Entonces cuando consultas
select isnumber('383XXXX')
- devuelve 0
select isnumber('38333434')
- devuelve 1
seleccione isnumber (mycol) mycol1, col2, colx de tablex; - devolverá 1s y 0s para la columna mycol1
- puede mejorar la función para tomar decimales, notación científica, etc.
La ventaja de usar un UDF es que puede usarlo en el lado izquierdo o derecho de su comparación de "cláusula where". Esto simplifica enormemente su SQL antes de ser enviado a la base de datos:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
espero que esto ayude.
Otra alternativa que parece más rápida que REGEXP en mi computadora es
SELECT * FROM myTable WHERE col1*0 != col1;
Esto seleccionará todas las filas donde col1 comienza con un valor numérico.
AND col1<>0
para manejar esa excepción.
'1a'
. Por cierto: es equivalente a WHERE col1 <> 0
- rextester.com/DJIS1493
Todavía me falta esta versión simple:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(la suma debería ser más rápida como multiplicación)
O la versión más lenta para seguir jugando:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
es VERDADERO
Recomiendo: si su búsqueda es simple, puede usar `
column*1 = column
`operator operator :) es trabajo y más rápido que en los campos varchar / char
SELECCIONAR * DESDE myTable WHERE columna * 1 = columna;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
y select '123aaa' >= 0
return verdadero?
SELECT * FROM myTable WHERE sign (col1)!=0
el signo de salida (0) es cero, pero luego podría restringir su consulta a ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
ACTUALIZACIÓN: Esto no es 100% confiable, porque "1abc" devolvería el signo de 1, pero "ab1c" devolvería cero ... por lo que esto solo podría funcionar para texto que no comienza con números.
He descubierto que esto funciona bastante bien
if(col1/col1= 1,'number',col1) AS myInfo
Intenta dividir / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table