Работа с условием IF-THEN-ELSE в запросах PostgreSQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Реализация условной логики в PostgreSQL происходит с помощью конструкции CASE, которая выполняет роль IF-THEN-ELSE:

SQL
Скопировать код
SELECT CASE WHEN условие THEN истина ELSE ложь END FROM ваша_таблица;

Замените в данном шаблоне условие, истина, ложь и ваша_таблица на то, что является релевантным для вашей задачи. Рассмотрим конкретный пример, когда значение field1 может равняться нулю, и важно избежать ошибки деления на ноль:

SQL
Скопировать код
SELECT field1, field2, CASE WHEN field1 > 0 THEN field2/field1 ELSE 0 END AS field3 FROM ваша_таблица;

Данное выражение означает: «Если field1 больше нуля, делаем деление field2 на field1, в противном случае возвращаем ноль». Так мы предотвращаем математически неприемлемое деление на ноль.

Кинга Идем в IT: пошаговый план для смены профессии

Nullif и coalesce — два активных помощника!

Когда возникает желание обезвредить неподходящие значения или иметь надежную запасную опцию, на помощь приходят функции nullif и coalesce — ваши союзники в области баз данных.

Функция nullif возвращает null, если её два аргумента равны, тем самым помогает избавиться от нежелательных данных. Coalesce, в свою очередь, находит и возвращает первое не-null значение в списке аргументов.

SQL
Скопировать код
SELECT field1, field2, 
       CASE WHEN field1 > 0 THEN field2/field1 
            ELSE coalesce(nullif(field1, 0), 1) 
       END AS field3 
FROM ваша_таблица;

За счет комбинированного использования coalesce и nullif с уверенностью можем работать с нулевыми значениями, превращая проблемы в ничто, так как нули преобразуются в единицы.

Управление множественной условной логикой

Часто при работе с базами данных приходится столкнуться с необходимостью учета множества условий. Сочетание функций coalesce и nullif внутри конструкции CASE позволяет с этим успешно справиться.

Рассмотрим ситуацию, при которой field1 меняется и мы хотим, чтобы field3 отражало эти изменения:

SQL
Скопировать код
SELECT field1, 
       field2, 
       CASE WHEN field1 > 100 THEN field2*2
            WHEN field1 BETWEEN 50 AND 100 THEN field2 + 50 
            ELSE coalesce(nullif(field2, 0), field1) 
       END AS field3 
FROM ваша_таблица;

Охватывая каждое вероятное состояние field1, вы обеспечиваете корректность результатов для каждого из них. Это подобно владению хорошо обученной собакой — она ведет себя согласно ожиданиям.

Визуализация

Представим условные конструкции как светофор:

Светофор 🚦: [Красный, Зеленый, Желтый]

IF-THEN-ELSE в SQL это проверка состояния светофора (IF), соответствующее действие (THEN) при зеленом сигнале 🟢 и осторожность (ELSE) при красном или желтом 🚨:

plaintext
Скопировать код
IF условие выполнено (🟢)
    THEN выполнить действие (➡️)
ELSE
    выполнить альтернативное действие (⛔️ или ⚠️)

Соблюдение правил дорожного движения предполагает остановку при красном свете 🚦.

Управление сложностью с помощью CASE

Чтобы решить более сложные задачи, давайте рассмотрим применение конструкции CASE и функций nullif и coalesce.

Забота о нулях

Функция nullif позволяет избежать катастрофы, предотвращая деление на ноль:

SQL
Скопировать код
SELECT field1, 
       field2, 
       CASE WHEN nullif(field1, 0) IS NOT NULL THEN field2/field1 
            ELSE 'Взрыв – неблагоприятный вариант развития событий!' -- Мы исключили деление на ноль, которое могло бы привести к катастрофе!
       END AS field3 
FROM ваша_таблица;

Математика во всей своей динамичности

Внесем разнообразие в конструкцию CASE с помощью динамичных математических операций:

SQL
Скопировать код
SELECT field1, field2, 
       CASE WHEN field1 > 0 THEN sqrt(field2)/field1 
            ELSE 'Вычисление корня из отрицательного значения? Вероятно, это комплексное число!' -- Математические шуточки, которые могут развеселить кого-то
       END AS field3
FROM ваша_таблица;

Объединение условий

Объединение параметров CASE и UNION ALL поможет справиться с любыми сценариями обработки данных:

SQL
Скопировать код
SELECT 'PositiveRatio' AS Type, field2/field1 AS Value
FROM ваша_таблица
WHERE field1 > 0
UNION ALL
SELECT 'DefaultZero', 'Снова этот негоший ноль' -- к нулям мы уже привыкли!
FROM ваша_таблица
WHERE field1 <= 0

Сценарии с триггерами

CASE может быть полезен для работы с неожиданными наборами данных. Давайте рассмотрим, как такие условия могут быть использованы в вашем проекте!

Многоуровневые выражения CASE

Вложенная конструкция CASE схожа со слоенным луком — каждый новый слой открывает что-то новое:

SQL
Скопировать код
SELECT CASE WHEN field1 > 100 THEN field2*2
            WHEN field1 BETWEEN 50 AND 100 THEN field2 + 50 
            ELSE CASE WHEN field1 <= 0 THEN 'Упс!'
                      ELSE field2 
                 END
       END AS field3 
FROM ваша_таблица;

Последовательная логика

Иногда логика условий следует как четкая последовательность. Возьмем для примера систему ранжирования:

SQL
Скопировать код
SELECT field1, 
       CASE WHEN field1 > 10 THEN 'Высокий'
            WHEN field1 > 5 THEN 'Средний'
            ELSE 'Малый' 
       END AS Размер
FROM ваша_таблица;

Данная конструкция возвращает 'Малый', 'Средний' или 'Высокий' в зависимости от значения field1, подобно размерам одежды, только для данных!

Охотники за null

Эффективная стратегия борьбы с неожиданными null значениями — призраками SQL:

SQL
Скопировать код
SELECT field1, 
       coalesce(field2/NULLIF(field1, 0), 'Деление на null не было произведено!') AS field3   
FROM ваша_таблица;

Полезные материалы

  1. PostgreSQL: Документация: Структуры управления — всегда полезно обратиться к официальной документации.
  2. sql – Ошибка синтаксиса в PostgreSQL около "IF" — на Stack Overflow вы можете узнать о проблемах других разработчиков с конструкцией IF-THEN-ELSE и извлечь уроки из их опыта.
  3. PostgreSQL – Конструкция CASE — на GeeksforGeeks представлено руководство по освоению конструкции CASE, чтобы вы могли полностью мастерить данный инструмент!
  4. PostgreSQL: Документация: PL/pgSQL – SQL процедурный языкполное руководство по процедурному языку PostgreSQL позволит вам быть готовыми ко всему.