Pull to refresh

Особенности оператора IF в SQL (

Преамбула


Практически все языки программирования предоставляют возможность использовать условные операторы. 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». Любой иной подход будет работать криво.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.