Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
19
Добавлен:
14.03.2016
Размер:
382.46 Кб
Скачать

Оператор case

Пример1: Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (ее нет в таблице РС), то вместо цены вывести текст «Нет в наличии».

Список всех моделей ПК с ценами можно получить с помощью запроса:

  1. SELECT DISTINCT Product.model, price

  2. FROM Product LEFT JOIN

  3. PC ON Product.model = PC.model

  4. WHERE product.type = 'pc'

В результирующем наборе отсутствующая цена будет заменена NULL-значением.

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:

  1. SELECT DISTINCT product.model,

  2. CASE

  3. WHEN price IS NULL

  4. THEN 'Нет в наличии'

  5. ELSE CAST(price AS CHAR(20))

  6. END price

  7. FROM Product LEFT JOIN

  8. PC ON Product.model = PC.model

  9. WHERE product.type = 'pc'

Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены.

Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению.

Оператор CASE может быть использован в одной из двух синтаксических форм записи:

1-я форма:

  1. CASE <проверяемое выражение>

  2. WHEN <сравниваемое выражение 1>

  3. THEN <возвращаемое значение 1>

  4. WHEN <сравниваемое выражение N>

  5. THEN <возвращаемое значение N>

  6. [ELSE <возвращаемое значение>]

  7. END

2-я форма:

  1. CASE

  2. WHEN <предикат 1>

  3. THEN <возвращаемое значение 1>

  4. WHEN <предикат N>

  5. THEN <возвращаемое значение N>

  6. [ELSE <возвращаемое значение>]

  7. END

Все предложения WHEN должны иметь одинаковую синтаксическую форму, то есть нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них, так как остальные просто не будут проверяться.

В приведенном выше примере была применена вторая форма оператора CASE.

Заметим, что для проверки на NULL стандарт предлагает более короткую форму — оператор COALESCE. Он имеет произвольное число параметров и возвращает значение первого из них, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

  1. CASE

  2. WHEN A IS NOT NULL

  3. THEN A

  4. ELSE B

  5. END

Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:

  1. SELECT DISTINCT Product.model,

  2. COALESCE(CAST(price AS CHAR(20)),'Нет в наличии') price

  3. FROM Product LEFT JOIN

  4. PC ON Product.model = PC.model

  5. WHERE Product.type = 'pc';

Применение первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере.

Пример2: Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.

  1. SELECT DISTINCT model, price,

  2. CASE price

  3. WHEN (SELECT MAX(price)

  4. FROM PC )

  5. THEN 'Самый дорогой'

  6. WHEN (SELECT MIN(price)

  7. FROM PC )

  8. THEN 'Самый дешевый'

  9. ELSE 'Средняя цена'

  10. END comment

  11. FROM PC

  12. ORDER BY price;

В результате запроса получим:

1232

350.0

Самый дешевый

1260

350.0

Самый дешевый

1232

400.0

Средняя цена

1232

600.0

Средняя цена

1233

600.0

Средняя цена

1121

850.0

Средняя цена

1233

950.0

Средняя цена

1233

980.0

Самый дорогой

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]