2012-02-27 32 views
5

tengo que escribir una consulta simple en mySQL que utilizaría MIN() en WHERE cláusula, el cálculo de un valor mínimo de dos números, donde uno de ellos es el valor de la columna (con posible valor NULL) y otro es un número fijo, algo como esto>MIN() en la cláusula WHERE

SELECT ... WHERE ... (len <= MIN(maxStay, 365))

sé que puedo escribir algo como>

SELECT ... WHERE ... ((len <= maxStay) OR (maxStay IS NULL)) AND (len <= 365)

pero preferiría algo simple, como usar MIN() en la cláusula WHERE. ¿Es posible? Y si es así, ¿cuál tiene mejor rendimiento?

+0

¿Qué quieres que el comportamiento sea si el valor de la columna es NULL? –

+0

@Ike ~ NULL significa sin límite –

+0

Gracias, compruebe mi respuesta actualizada. Debería hacer lo que quieras. –

Respuesta

5

Para devolver el menor de los dos valores, use la función LEAST en MySql. Para manejar los valores nulos, use IFNULL().

WHERE len <= LEAST(IFNULL(maxStay, 365), 365) 
+0

Derecha. Eliminé el comentario referido a su respuesta antes de editar. – Kamil

+0

@Michael ~ valor NULL debe significar ningún límite, por lo que creo que la fórmula correcta debe ser 'WHERE len <= LEAST (IFNULL (maxStay, 365), 365)', ¿correcto? ¿Qué hay del rendimiento? –

+0

@stackoverflow El rendimiento dependerá de sus índices. Si len está indexado, entonces esta consulta debería hacer uso de ese índice. Sin embargo, maxStay no será sargable con esta consulta ... –

-1

La función que busca es LEAST():

mysql> select least(1,2); 
+------------+ 
| least(1,2) | 
+------------+ 
|   1 | 
+------------+ 

Por lo que su consulta sería algo como esto (actualizado para manejar los nulos según sea necesario):

SELECT ... 
WHERE ... ((maxStay IS NULL) OR (maxStay IS NOT NULL AND len <= LEAST(maxStay, 365))) 
+0

LEAST no resolverá los valores NULL por sí mismo. – GolezTrol

+0

Gracias. No noté que el OP mencionaba NULLs. Agregué un comentario a la pregunta pidiendo aclaraciones sobre qué hacer en el caso de valores de columna NULL. –

0

Usted desea que la LEAST función; MIN es una función de agregado en la columna valora

2

min y max son funciones de agregado y no se pueden utilizar en la cláusula where, a pesar de que se pueden utilizar en la cláusula having.

Pero creo que está buscando LEAST, aunque no funciona con valores NULL. Si escribe LEAST(1, NULL), siempre devolverá NULL, cualquiera que sea el valor que ponga en lugar de 1.

Usted podría utilizar IFNULL para evitar esto:

SELECT 
    ... 
WHERE 
    len <= LEAST(IFNULL(maxStay, 365), 365) 
+0

Eso no funcionará. LEAST() necesita 2 argumentos. ¿Querías escribir esto en su lugar? 'LEAST (IFNULL (maxStay, 365), 365)' –

+0

Creo que Ike tiene razón –

+0

Vaya. Me olvidé un poco. Arreglado. Gracias, Ike. – GolezTrol