2012-02-27 4 views
5

мне нужно написать простой запрос в MySQl, который будет использовать MIN() в WHERE пункте, вычисление минимального значения двух чисел, где один из них является значение столбца (с возможным значением NULL) и другой один фиксированный номер, что-то вроде этого>MIN() в ИНЕКЕ

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

Я знаю, что могу написать что-то вроде>

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

, но я бы предпочел что-то простое, например, используя MIN() в статье WHERE. Это возможно? И если да, то есть более высокая производительность?

+0

Что вы хотите, чтобы поведение, если значение столбца NULL? –

+0

@Ike ~ NULL означает без ограничений –

+0

Спасибо, пожалуйста, уточните мой обновленный ответ. Он должен делать то, что вы хотите. –

ответ

5

Чтобы вернуть меньшее из двух значений, используйте функцию LEAST в MySql. Для обработки нулевых значений используйте IFNULL().

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

Право. Я удалил комментарий, относящийся к вашему ответу перед редактированием. – Kamil

+0

@Michael ~ Значение NULL должно означать не ограничение, поэтому я считаю, что правильная формула должна быть 'WHERE len <= LEAST (IFNULL (maxStay, 365), 365)', правильно? Как насчет производительности? –

+0

@stackoverflow Производительность будет зависеть от ваших индексов. Если len индексируется, тогда этот запрос должен использовать этот индекс. Тем не менее, maxStay не будет поддаваться такому запросу ... –

-1

Функция вы ищете LEAST():

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

Таким образом, ваш запрос будет что-то вроде этого (обновление для обработки NULLs при необходимости):

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

LEAST не решит значения NULL – GolezTrol

+0

Спасибо. Я не заметил ОП упомянутых NULL. Я добавил комментарий к вопросу с просьбой уточнить, что делать в случае значений столбца NULL. –

0

Вы хотите LEAST функция; MIN представляет собой совокупность функция на колонке значений

2

min и max являются агрегатные функции и не могут быть использованы в предложении where, хотя они могут быть использованы в пункте having.

Но я думаю, что вы ищете LEAST, хотя он не работает со значениями NULL. Если вы напишете LEAST(1, NULL), он всегда будет возвращать NULL, какое бы значение вы ни выбрали вместо 1.

Вы можете использовать IFNULL работать вокруг этого:

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

Это не сработает. LEAST() требует 2 аргумента. Вы имели в виду набрать это вместо этого? 'LEAST (IFNULL (maxStay, 365), 365)' –

+0

Я считаю, что Ike прав –

+0

Упс. Я немного забыл. Починил это. Спасибо, Айк. – GolezTrol