¿Cómo compruebo si un valor es un entero en MySQL?


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

 100
Author: Chetan Gawai, 2008-09-16

11 answers

Asumiré que desea verificar un valor de cadena. Una buena forma es el operador REGEXP, haciendo coincidir la cadena con una expresión regular. Simplemente haga

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

Esto es razonablemente rápido. Si su campo es numérico, simplemente pruebe

ceil(field) = field

En su lugar.

 181
Author: Jumpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 19:13:47

Compararlo con una expresión regular.

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

Re: IsNumeric () clause in MySQL??
Publicado por: kevinclark ()
Fecha:08 de agosto de 2005 01: 01PM


estoy de acuerdo. He aquí una función que he creado 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 opcional al principio, un punto decimal opcional y el resto numérico dígitos.

 12
Author: JBB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-05 20:13:53

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

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

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

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
 10
Author: Tarun Sood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 08:57:49

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

select * from calender where year > 0

Devolverá true si el año es numérico de lo contrario false

 8
Author: Jayjitraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 11:37:32

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 i.e. > 0
 6
Author: Riad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-24 12:33:40

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

SELECT col1 FROM table WHERE concat('',col * 1) = col;
 3
Author: minhas23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-29 07:36:58

¿Qué pasa con:

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

Para probar numérica y el corrolario:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
 3
Author: Tom Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 21:56:43

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 volverá 1 (TRUE), es decir, 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.

El 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 volverá 0 (FALSE) porque el principio de la cadena es texto y no numérico.

Sin embargo, si está tratando con cadenas que tienen una mezcla 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.

 2
Author: Bill Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-17 10:27:41

Lo mejor que podría 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 demo http://sqlfiddle.com/#! 9 / ff40cd/44

 1
Author: Raymond Nijland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 10:59:37

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

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

Puede tener restricciones cuando se llega a los números NNNNE+- más grandes

 0
Author: PodTech.io,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 12:57:41

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]+)$';

Desde kevinclark todas las demás devuelven cosas inútiles para mí en caso de 234jk456 o 12 inches

 0
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-26 09:31:51