una - Detecta si el valor es número en MySQL
numeros consecutivos sql (13)
¿Hay alguna manera de detectar si un valor es un número en una consulta MySQL?
por ejemplo, SELECT * FROM myTable WHERE isANumber(col1)=true
puedes hacerlo usando
CAST
SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")
Esta respuesta es similar a Dmitry, pero permitirá los números decimales y positivos y negativos.
select * from table where col1 REGEXP ''^[[:digit:]]+$''
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 posterior)
Esto resuelve todos tus problemas? ya que las cadenas no se calcularán de la misma manera que los números ...
SELECT * FROM myTable WHERE sign (col1)!=0
Por supuesto, el signo (0) es cero, pero luego puede restringir su consulta a ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
He descubierto que esto funciona bastante bien
if(col1/col1= 1,''number'',col1) AS myInfo
Intente dividir / 1
select if(value/1>0 or value=0,''its a number'', ''its not a number'') from table
Lo recomiendo: si su búsqueda es simple, puede usar `
column*1 = column
`operator interesting :) es trabajo y más rápido que en los campos varchar / char
SELECCIONAR * FROM myTable WHERE column * 1 = column;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
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.
Si sus datos son ''prueba'', ''test0'', ''test1111'', ''111test'', ''111''
Para seleccionar todos los registros donde los datos son un simple int:
SELECT *
FROM myTable
WHERE col1 REGEXP ''^[0-9]+$'';
Resultado: ''111''
(En expresiones regulares, ^ significa comenzar, y $ significa finalizar)
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 el número, use esto:
SELECT *
FROM myTable
WHERE col1 REGEXP ''[0-9]+'';
Resultado: ''test0'' y ''test1111'' y ''111test'' y ''111''
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
Todavía falta esta versión simple:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(la adición debe ser más rápida que la 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
use una 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;
Luego cuando consultas
select isnumber(''383XXXX'')
--revoluciones 0
select isnumber(''38333434'')
--retornos 1
seleccione isnumber (mycol) mycol1, col2, colx de tablex; - Devolverá 1s y 0s para la columna mycol1
- puedes mejorar la función para tomar decimales, notación científica, etc.
La ventaja de utilizar un UDF es que puede usarlo en el lado izquierdo o derecho de su comparación "where clause". esto simplifica mucho su SQL antes de ser enviado a la base de datos:
SELECT * from tablex where isnumber(columnX) = isnumber(''UnkownUserInput'');
espero que esto ayude.
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