sumar registro optimizar obtener lentas fecha consultas anterior mysql

registro - optimizar consultas lentas mysql



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

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.


Aquí está la solución simple para que asuma 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


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 resto dígitos numéricos.


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


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


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


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


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


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