Исследуем возможности CASE

ПУБЛИКАЦИИ  

По материалам статьи Arthur Fuller : Exploring the uses of CASE
Перевод Александра Гладченко

Вы имеете прекрасную возможность составлять условия выборки для своих запросов к SQL Server таким образом, что бы получить очень гибкие варианты представления возвращаемых данных.
Функция CASE, наверное, одна из наиболее редко используемых в SQL. Чаще всего её используют для генерации вариантов значений поля в выборках, однако, у этой функции есть ещё много полезных применений. Например, Вы можете использовать CASE в предложении WHERE.
Сначала давайте сделаем обзор синтаксиса CASE. В типичной SELECT - выборке, функцию можно применять так:


SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END

Нужно заменить взятые в треугольные скобки параметры из приведенного выше примера, например, как это делается в следующем примере:


USE pubs 
GO
SELECT
Title,
'Price Range' =
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO

Это типичный вариант использования CASE, но Вы можете взять от CASE намного больше. Например, посмотрите как функция CASE может быть использована в предложении GROUP BY:


SELECT 'Number of Titles', Count(*)
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
GO

Вы даже можете дополнить этот запрос сортировкой, добавив предложение ORDER BY:


USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO

Обратите внимание, что в последнем примере запроса необходимо повторять относящийся к CASE блок кода в блоке SELECT, чтобы его можно было использовать в блоке GROUP BY.
Функция CASE полезна и в разнообразных ситуациях, не относящихся к выборкам данных. Но, приложив немного старания и находчивости, Вы сможете так группировать и сортировать результирующий набор запроса, что на первый взгляд казалось бы невозможным.

Артур Фаллер разрабатывает приложения базы данных уже в течение более 20 лет. Основными его инструментами являются Access ADP, Microsoft SQL 2000, MySQL и .NET.

[В начало]


Перевод: Александра Гладченко  2005г.

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz