loading..
Русский    English
17:22
листать

Функция CHOOSE

Нестандартная функция CHOOSE появилась в SQL Server версии 2012.

Функция CHOOSE используется для выбора одного из нескольких вариантов. Выбор осуществляется на основании индекса (номера варианта), который является первым параметром функции. Остальные параметры представляют собой варианты выбора. Будет выбран тот вариант, номер которого в списке параметров, совпадает с индексом.

Например, запрос

Консоль
Выполнить
  1. SELECT CHOOSE(2,'PC','Laptop','Printer');
вернет Laptop, т.к. это второй элемент списка.

Больший интерес представляет случай, когда индексом является выражение, включающее столбцы таблиц.

Пусть нам требуется вместо номера пункта (в базе данных "Вторсырье") выводить его название.

Поскольку в базе данных названия пунктов не хранятся, будем формировать их "налету", используя функцию CHOOSE:

Консоль
Выполнить
  1. SELECT DISTINCT point,
  2. CHOOSE(point, 'point A', 'point B', 'point C') point_name
  3. FROM outcome;

point    point_name
1   point A
2   point B
3   point C

Очевидно, что функция CHOOSE является еще одним частным вариантом выражения CASE. Наш пример с использовании функции CASE можно переписать в виде:

Консоль
Выполнить
  1. SELECT DISTINCT point,  
  2. CASE point
  3.       WHEN 1 THEN 'point A'
  4.       WHEN 2 THEN 'point B'
  5.       WHEN 3 THEN 'point C'
  6. END point_name
  7. FROM outcome;

Если указанному индексу не будет найдено соответствия, то результатом функции CHOOSE будет NULL:

Консоль
Выполнить
  1. SELECT CHOOSE(4,'PC','Laptop','Printer');

Для обработки этого случая в выражении CASE предусмотрено предложение ELSE. С помощью этого предложения мы можем вместо NULL (по умолчанию) вывести, например, UNKNOWN:

Консоль
Выполнить
  1. SELECT CASE 4
  2.      WHEN 1 THEN 'PC'
  3.      WHEN 2 THEN 'Laptop'
  4.      WHEN 3 THEN 'Printer'
  5.     ELSE 'UNKNOWN'
  6. END;

Мы легко можем преодолеть этот "недостаток" функции CHOOSE, обернув её функцией COALESCE:

Консоль
Выполнить
  1. SELECT COALESCE(CHOOSE(4,'PC','Laptop','Printer'),'UNKNOWN');
но это уже как бы "масло масляное" - case от case.

Можно сказать, что функция CHOOSE имеет специфическое применение, но в этих ограниченных случаях она позволяет упростить запись.

В заключение приведем еще один пример.

Для каждой модели указать, является её номер четным (even) или нечетным (odd).

Консоль
Выполнить
  1. SELECT model, CHOOSE(model%2+1, 'EVEN', 'ODD')
  2. FROM product
  3. WHERE ISNUMERIC(model) =1;

Предикат в предложении WHERE используется для того, чтобы ограничиться моделями, номера которых представлены числом. Обратите внимание на тип данных столбца model! Надеюсь, что те, кто решает упражнения на сайте sql-ex.ru уже в курсе. :-) Они также должны быть в курсе, что использование функции ISNUMERIC в данном контексте не является радикальным решением.

Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
Штукатурка как материал для отделки потолка
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.