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/WHERE
  • IF — обычно в хранимых процедурах

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 $$;

📚 Что запомнить?

  1. IIF — это "быстрый IF" для простых условий
  2. IF — мощный инструмент для процедур
  3. CASE — универсальный вариант для всех СУБД
  4. Всегда проверяйте синтаксис для вашей СУБД

Попробуйте прямо сейчас в вашей базе данных! Какие условия вы будете проверять первыми? 😉

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео