Функция CHOOSE

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

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

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

select CHOOSE(2,'PC','Laptop','Printer');
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
вернет Laptop, т.к. это второй элемент списка.

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

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

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

select distinct point,
CHOOSE(point, 'point A', 'point B', 'point C') point_name
from outcome;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
pointpoint_name
1point A
2point B
3point C

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

select distinct point,
case point
      when 1 then 'point A'
      when 2 then 'point B'
      when 3 then 'point C'
end point_name
from outcome;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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

select CHOOSE(4,'PC','Laptop','Printer');
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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

select case 4
     when 1 then 'PC'
     when 2 then 'Laptop'
     when 3 then 'Printer'
    else 'UNKNOWN'
end;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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

select COALESCE(CHOOSE(4,'PC','Laptop','Printer'),'UNKNOWN');
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
но это уже как бы “масло масляное” - case от case.

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

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

Для каждой модели указать, является её номер четным (even) или нечетным (odd).
select model, CHOOSE(model%2+1, 'EVEN', 'ODD')
from product
where ISNUMERIC(model) =1;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

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