использование IF в MySQL (не функция)

У меня есть то, что кажется простым вопросом, но я не могу понять его правильно. Я просто пытаюсь выполнить обычную логику IF... THEN..., но не могу понять это правильно:

set @var:=2;
if @var=1 THEN select 'hello';

Я получил:

ОШИБКА 1064 (42000):

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'if @var=1 THEN выберите 'hello'' в строке 1

Что мне не хватает?


person Mordechai    schedule 12.11.2012    source источник
comment
Вы можете выполнять эти операторы только в процедуре или функции.   -  person juergen d    schedule 12.11.2012
comment
почти трудно поверить. есть ли у них какое-либо оправдание такому жестокому и необычному требованию?   -  person Mordechai    schedule 12.11.2012


Ответы (2)


Вы можете, но только внутри функций, процедур и триггеров, например:

DELIMITER //
DROP PROCEDURE IF EXISTS anyname//
CREATE PROCEDURE anyname()
BEGIN
    IF @var1 = 1 THEN
        SELECT 'hello';
    END IF;
END//
SET @var1 := 1;
CALL anyname()//
person eisberg    schedule 12.11.2012
comment
Я думаю, что всем нам нужно больше подробностей о вашей цели, прежде чем мы сможем дать квалифицированный ответ. - person eisberg; 12.11.2012
comment
какие детали? Я начинаю думать, что я единственный, кто когда-либо использовал условный оператор в пакетном режиме :) Если вам нужна дополнительная информация, пожалуйста, спрашивайте. - person Mordechai; 12.11.2012
comment
вот один пример обходного пути, который я нашел. Хотя хотел бы избежать этого, если бы мог: stackoverflow.com /вопросы/9899663/ - person Mordechai; 12.11.2012
comment
Итак, вы не можете поместить свой скрипт в процедуру? - person eisberg; 13.11.2012
comment
не в этом дело. Я просто пойду со странными обходными путями. Благодарю. - person Mordechai; 13.11.2012

Вместо этого вы можете использовать CASE.

SET @var:=2; 
SELECT CASE WHEN @var=1 THEN 'hello' ELSE 'no hello' END;
--prints 'no hello'

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN 'hello' ELSE 'no hello' END;
--prints 'hello'

Я надеюсь, что идея ясна с приведенными выше примерами.

Редактировать: чтобы решить дополнительные проблемы OP, вы можете включить select в утверждения case, но вы должны заключить их в квадратные скобки. Например.

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN (select 'hello') ELSE (select 'no hello') END;

Следует отметить, что он должен возвращать только одно значение (из одной строки и столбца)

person nawfal    schedule 12.11.2012
comment
спасибо, но это не сработает даже для чего-то более сложного, например: если @var=1 выберите *from tableX иначе выберите * frm tableY - person Mordechai; 12.11.2012
comment
@MorDeror нравится что? Я уверен, что есть выход - person nawfal; 12.11.2012
comment
@MorDeror тоже работает. см. мою правку. Если вы расскажете нам, чего именно вы пытаетесь достичь, мы сможем помочь лучше - person nawfal; 12.11.2012
comment
спасибо @nawfal, но возвращение всего одного столбца, вероятно, не покроет большинство случаев использования - person Mordechai; 12.11.2012
comment
@MorDeror Да, это не покроет большинство случаев, но вам нужно получить несколько столбцов, если в противном случае логика является запахом кода. Чую конструктивный недостаток. Я прошу вас опубликовать фактическое требование, всегда будет лучшая альтернатива - person nawfal; 12.11.2012
comment
мне кажется, что получение данных из определенной таблицы по заданному условию не такой уж и страшный недостаток дизайна. :) Что касается того, что мне изначально нужно было проверить, существует ли строка, прежде чем пытаться вставить. - person Mordechai; 12.11.2012
comment
@MorDeror это не так, и именно поэтому у вас есть WHERE, CASE и IF, но они предназначены для разных целей. Вы как бы просите функциональность WHERE в CASE. Если вы хотите условно вставить, то это совершенно другая вещь, но это легко выполнимо, чем эти хаки. См. эту ссылку для примера stackoverflow.com/questions/13302714/ В SO также есть много других подобных ссылок. - person nawfal; 12.11.2012
comment
Благодарю. Это решает мою проблему, хотя и подтверждает мое мнение о том, что MySQL не следует использовать для какой-либо реальной работы с БД. :) - person Mordechai; 12.11.2012
comment
Пожалуйста. Я согласен, что MySQL на самом деле не самый лучший. Он совсем не многофункциональный по сравнению с другими Dbms-es - он пропускает пересечение, кроме/минус, возможность поворота, оконные функции и дальше от стандартного ANSI SQL по сравнению с другими основными игроками, не забывая о нелогичных вещах, которые он позволяет нам делать с его группа по. Но причина, по которой он так популярен, заключается в том, что он очень прост, что мне и нравится. Не только синтаксически, но даже не ограничивая нас препятствиями. - person nawfal; 12.11.2012