Преамбула
Практически все языки программирования предоставляют возможность использовать условные операторы. SQL не исключение, однако, сам лично столкнулся с парочкой особенностей, на осознание которых пришлось убить несколько часов. Ниже рассмотрим одну из них. Думаю, кому-то эта статья может сэкономить драгоценное время.
Проблема: условие на наличие переменной
Во всех языках, с которыми раньше сталкивался, везде выражение «if(var)», если «var» существует, выдаёт «1», в противном случае «0». В MySQL же всё работает в лучшем случае наоборот, в худшем же, по совсем невнятной логике.
Так код, вопреки ожидаемому «if», выдаёт «else».
-- пример с ошибкой #1
begin
SET @var='hi';
IF(@var) THEN SELECT 'if';
ELSE SELECT 'else';
END IF;
end
Результат: «else».
Если же
"IF(@var)"
заменить на "IF(!@var)"
, то действует опять-таки по своей странной логике, выдавая «if»:-- пример с ошибкой #2
begin
SET @var='hi';
IF(!@var) THEN SELECT 'if';
ELSE SELECT 'else';
END IF;
end
Результат: «if».
Решение
Условие на наличие переменной должно выглядеть так:
"IF(@var IS NULL)"
или "IF(@var IS NOT NULL)"
. Краткая запись, приведённая выше, в SQL не работает.-- Верный пример #1
begin
SET @var='hi';
IF(@var IS NOT NULL) THEN SELECT 'if';
ELSE SELECT 'else';
END IF;
end
Результат: «if».
-- Верный пример #2
begin
SET @var='hi';
IF(@var IS NULL) THEN SELECT 'if';
ELSE SELECT 'else';
END IF;
end
Результат: «else».
Вывод: проверяем наличие переменной только с помощью «is null» или «is not null». Любой иной подход будет работать криво.