¿Cómo puedo verificar si un valor es un número entero en MySQL?

Veo que dentro de MySQL hay funciones Cast() y Convert() para crear enteros a partir de valores, pero ¿hay alguna manera de verificar si un valor es un número entero? Algo así como is_int() en PHP es lo que estoy buscando.

Asumiré que quieres verificar un valor de cadena. Una buena forma es el operador REGEXP, que combina la cadena con una expresión regular. Simplemente hazlo

 select field from table where field REGEXP '^-?[0-9]+$'; 

esto es razonablemente rápido. Si tu campo es numérico, solo prueba para

 ceil(field) = field 

en lugar.

Combínalo con una expresión regular.

cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 como se cita a continuación:

Re: cláusula IsNumeric () en MySQL ??
Publicado por: kevinclark ()
Fecha: 08 de agosto de 2005 a las 01:01 p.m.

Estoy de acuerdo. Aquí hay una función que creé para MySQL 5:

 CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

Esto permite un signo más / menos al principio, un punto decimal opcional y el rest dígitos numéricos.

Supongamos que tenemos una columna con campo alfanumérico con entradas como

 a41q 1458 xwe8 1475 asde 9582 . . . . . qe84 

y desea el valor numérico más alto de esta columna db (en este caso es 9582), entonces esta consulta le ayudará

 SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$' 

Aquí está la solución simple para que asum que el tipo de datos es varchar

 select * from calender where year > 0 

Volverá verdadero si el año es numérico, más falso

Esto también funciona:

 CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string. 

por ejemplo

 SELECT CAST('a123' AS UNSIGNED) // returns 0 SELECT CAST('123' AS UNSIGNED) // returns 123 ie > 0 

Para verificar si un valor es Int en Mysql, podemos usar la siguiente consulta. Esta consulta dará las filas con valores Int

 SELECT col1 FROM table WHERE concat('',col * 1) = col; 

Qué pasa:

 WHERE table.field = "0" or CAST(table.field as SIGNED) != 0 

para probar el numérico y el corrolario:

 WHERE table.field != "0" and CAST(table.field as SIGNED) = 0 

He intentado usar las expresiones regulares enumeradas anteriormente, pero no funcionan para lo siguiente:

 SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

Lo anterior devolverá 1 ( TRUE ), lo que significa que la prueba de la cadena ’12 PULGADAS ‘contra la expresión regular anterior, devuelve TRUE . Parece un número basado en la expresión regular utilizada anteriormente. En este caso, como el 12 está al principio de la cadena, la expresión regular lo interpreta como un número.

Lo siguiente devolverá el valor correcto (es decir, 0 ) porque la cadena comienza con caracteres en lugar de dígitos

 SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

Lo anterior devolverá 0 ( FALSE ) porque el comienzo de la cadena es texto y no es numérico.

Sin embargo, si se trata de cadenas que tienen una combinación de números y letras que comienzan con un número, no obtendrá los resultados que desea. REGEXP interpretará la cadena como un número válido cuando en realidad no lo es.

Lo mejor que pude pensar de una variable es una int. Es una combinación con las funciones de MySQL CAST() y LENGTH() .
Este método funcionará en cadenas, enteros, tipos de datos dobles / flotantes.

 SELECT (LENGTH(CAST([data] AS UNSIGNED))) = (LENGTH([data])) AS is_int 

ver la demo http://sqlfiddle.com/#!9/ff40cd/44

Esto funciona bien para VARCHAR donde comienza con un número o no ..

 WHERE concat('',fieldname * 1) != fieldname 

puede tener restricciones cuando llegue al NNNNE + más grande – números

para mí lo único que funciona es:

 CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

de kevinclark todo lo demás devuelve cosas inútiles para mí en caso de 234jk456 o 12 inches