Оператори case, coalesce, nullif, сторінка 3

Порахувати загальну кількість рейсів з Ростова і кількість рейсів, пунктом призначення яких не є Москва.

У цьому завданні теж потрібно виконати агрегацію за двома вибірками, при цьому одна з вибірок є підмножиною другої. Тому тут безпосередньо не підійде обчислюваний стовпець, по якому можна виконати угруповання. Це годилося для вирішення попередньої задачі, коли безліч поділялося на власні непересічні підмножини, по кожному з яких було потрібно виконати агрегацію.

Для вирішення даного завдання ми можемо порахувати кількість по всій множині і використовувати підзапит для підрахунку значень в підмножині (друге звернення до таблиці) або використовувати CASE в поєднанні з агрегатної функцією, щоб уникнути повторного читання таблиці. Давайте подивимося, як оцінить оптимізатор ці варіанти.

Використання підзапиту

Використання CASE з агрегатної функцією

Результат, звичайно, буде однаковий:


а ось вартість другого запиту, як і очікувалося, виявилася вдвічі нижче.

Ви можете порівняти реальний час виконання, якщо сгенеріруете достатній обсяг даних.

Другий варіант можна записати більш компактно, якщо використовувати функцію NULLIF - скорочений варіант окремого випадку використання CASE:

Функція NULLIF повертає NULL, якщо її аргументи дорівнюють, або перший аргумент в іншому випадку.

У рішенні використовується той факт, що агрегатні функції не враховують NULL-значення, які з'являються в аргументі функції COUNT тоді, коли місто прибуття дорівнює 'Moscow'.

Попередня [Перетворення типів і оператор CAST]

[Оператори модифікації даних] Наступна

Підручник оновлювався
декілька днів тому