¿Hay alguna manera de detectar si un valor es un número en una consulta MySQL? Como
SELECT *
FROM myTable
WHERE isANumber(col1) = true
mysql
sql
where-clause
Urbycoz
fuente
fuente
Respuestas:
Esto debería funcionar en la mayoría de los casos.
No funciona para números no estándar como
1e4
1.2e5
123.
(decimal final)fuente
También puedes usar Expresión regular ... sería como:
Referencia: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
fuente
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:
Resultado: '111'
(En regex, ^ significa comenzar y $ significa fin)
Para seleccionar todos los registros donde existe un número entero o decimal:
Resultado: '111' (igual que el último ejemplo)
Finalmente, para seleccionar todos los registros donde existe un número, use esto:
Resultado: 'test0' y 'test1111' y '111test' y '111'
fuente
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
También coincidirá con decimales firmados (como -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Prueba:
Resultado:
Manifestación
fuente
Devuelve filas numéricas
Encontré la solución con la siguiente consulta y funciona para mí:
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
):fuente
SELECT * FROM myTable WHERE col1 = 123;
consulta devolverá filas, incluso el valor de col es123abc
Esta respuesta es similar a Dmitry, pero permitirá decimales, así como números positivos y negativos.
fuente
use un UDF (función definida por el usuario).
Entonces cuando consultas
- devuelve 0
- 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:
espero que esto ayude.
fuente
Otra alternativa que parece más rápida que REGEXP en mi computadora es
Esto seleccionará todas las filas donde col1 comienza con un valor numérico.
fuente
AND col1<>0
para manejar esa excepción.'1a'
. Por cierto: es equivalente aWHERE col1 <> 0
- rextester.com/DJIS1493Todavía me falta esta versión simple:
(la suma debería ser más rápida como multiplicación)
O la versión más lenta para seguir jugando:
fuente
'a' + 0 = 'a'
es VERDADERORecomiendo: si su búsqueda es simple, puede usar `
`operator operator :) es trabajo y más rápido que en los campos varchar / char
fuente
select 'aaa123' >= 0
yselect '123aaa' >= 0
return verdadero?el signo de salida (0) es cero, pero luego podría restringir su consulta a ...
fuente
fuente
He descubierto que esto funciona bastante bien
fuente
col1 <> 0
y da un falso positivo para1a
- rextester.com/HLORBZ1242Intenta dividir / 1
fuente