IF и IIF: условные выражения в разных СУБД
🔍 Что такое IF и IIF?
Условные выражения — это "мозг" SQL-запросов! Они позволяют:
- Возвращать разные значения в зависимости от условий
- Обрабатывать NULL-значения
- Создавать ветвления прямо в запросах
В разных СУБД есть 2 основных подхода:
- IF — классическое условие с блоком THEN/ELSE (чаще в процедурах)
- IIF — компактная inline-версия IF (похожа на тернарный оператор)
🛠️ IIF: "Тернарный оператор" SQL
IIF(условие, значение_если_истина, значение_если_ложь) — работает как ? в Python/JS.
Пример в MS SQL Server и Access:
SELECT
name,
IIF(age >= 18, 'Взрослый', 'Ребёнок') AS age_group
FROM users;
👉 Если age >= 18 — вернёт "Взрослый", иначе — "Ребёнок".
🔄 IF: Полноценное ветвление
Работает в MySQL, PostgreSQL (в функциях), T-SQL:
-- MySQL/PostgreSQL функция
CREATE FUNCTION check_age(age INT) RETURNS VARCHAR(20)
BEGIN
IF age < 18 THEN
RETURN 'Ребёнок';
ELSEIF age BETWEEN 18 AND 65 THEN
RETURN 'Взрослый';
ELSE
RETURN 'Пенсионер';
END IF;
END;
🌍 Сравнение СУБД: Где что работает?
| СУБД | IIF | IF (в запросах) | CASE |
|---|---|---|---|
| MS SQL | ✅ | ❌ (только в T-SQL) | ✅ |
| MySQL | ❌ | ✅ (в функциях) | ✅ |
| PostgreSQL | ❌ | ✅ (в PL/pgSQL) | ✅ |
| Oracle | ❌ | ❌ | ✅ |
| SQLite | ❌ | ❌ | ✅ |
🔥 Pro Tip: CASE — универсальная замена для всех СУБД!
🔥 Практика: Реальные кейсы
Пример 1: Разметка ценового сегмента
-- MS SQL
SELECT
product_name,
IIF(price > 1000, 'Premium', 'Standard') AS segment
FROM products;
Пример 2: Обработка NULL-значений
-- MySQL (через CASE)
SELECT
username,
CASE
WHEN last_login IS NULL THEN 'Никогда'
ELSE CONCAT('Был ', last_login)
END AS login_status
FROM users;
🎯 Главные отличия IF vs IIF
1. Синтаксис:
IIF— одна строка,IF— блок кода
2. Где используется:
IIF— прямо в SELECT/WHEREIF— обычно в хранимых процедурах
3. Поддержка:
IIF— только некоторые СУБДIF— везде, но с разным синтаксисом
💡 Когда что выбирать?
✔ IIF — для простых условий в запросах. Пример:
SELECT IIF(COUNT(*) > 0, 'Есть данные', 'Пусто') FROM orders;
✔ IF — для сложной логики в функциях. Пример:
-- T-SQL
IF EXISTS (SELECT 1 FROM users WHERE banned = 1)
BEGIN
PRINT 'Есть заблокированные!';
END
✔ CASE — когда нужна кросс-СУБД совместимость:
SELECT
CASE WHEN score > 90 THEN 'A'
WHEN score > 70 THEN 'B'
ELSE 'C'
END AS grade
FROM tests;
🚀 Продвинутые фишки
Вложенные IIF (осторожно!):
-- MS SQL
SELECT
IIF(age < 13, 'Ребёнок',
IIF(age < 20, 'Подросток', 'Взрослый'))
FROM users;
👉 Лучше заменить на CASE для читаемости!
IF + динамический SQL:
-- PostgreSQL
DO $$
BEGIN
IF (SELECT count(*) FROM logs) > 100000 THEN
EXECUTE 'TRUNCATE TABLE logs';
END IF;
END $$;
📚 Что запомнить?
IIF— это "быстрый IF" для простых условийIF— мощный инструмент для процедурCASE— универсальный вариант для всех СУБД- Всегда проверяйте синтаксис для вашей СУБД
Попробуйте прямо сейчас в вашей базе данных! Какие условия вы будете проверять первыми? 😉