CHOOSE: примеры (SQL)

Использование функции CHOOSE для выбора значений в T-SQL
Раздел: Логические функции, Условные
CHOOSE(index, value1 [, value2, ]): Depends on values

Функция CHOOSE в MS SQL

Функция CHOOSE возвращает элемент из списка значений по указанному индексу. Она часто используется для упрощения логики выбора одного значения из набора альтернатив на основе порядкового номера. Функция доступна начиная с SQL Server 2012.

Синтаксис и аргументы

Синтаксис функции: CHOOSE ( index, val_1, val_2 [, val_n ] ).

  • index — целочисленное выражение (начиная с 1). Определяет, какое значение из последующих аргументов будет возвращено. Если значение не целое, оно неявно преобразуется в целый тип.
  • val_1 ... val_n — список значений любого совместимого типа данных. Максимальное количество значений — 254.

Возвращаемое значение

Функция возвращает значение с наибольшим приоритетом типа данных из списка val_1 ... val_n, соответствующее позиции index. Если index выходит за пределы диапазона (меньше 1 или больше числа переданных значений), возвращается NULL. Если index равен NULL, функция также вернет NULL.

Примеры использования CHOOSE

Простой выбор значения

Пример с числами:

SELECT CHOOSE(2, 10, 20, 30) AS Result;
Result
20

Работа со строками

SELECT CHOOSE(1, 'Январь', 'Февраль', 'Март') AS MonthName;
MonthName
Январь

Обработка индекса за пределами диапазона

SELECT CHOOSE(5, 'A', 'B', 'C') AS OutOfRange;
OutOfRange
NULL

Индекс как выражение

DECLARE @idx INT = 3;
SELECT CHOOSE(@idx, 'Red', 'Green', 'Blue') AS Color;
Color
Blue

Похожие функции в MS SQL

CASE

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

IIF

Функция IIF является сокращенной записью для CASE с двумя возможными исходами. Она принимает логическое условие и два возвращаемых значения.

CHOOSE удобна, когда выбор основан на порядковом номере, особенно если этот номер уже вычислен. CASE предпочтительнее для сложных условий, а IIF — для простых бинарных решений.

Аналоги функции в других СУБД и языках

MySQL

Функция ELT работает аналогично.

SELECT ELT(2, 'Apple', 'Banana', 'Cherry');
Banana

Oracle

Прямого аналога нет. Используется выражение DECODE или CASE.

SELECT DECODE(2, 1, 'One', 2, 'Two', 'Other') FROM DUAL;
Two

PostgreSQL

Встроенной функции CHOOSE нет. Можно использовать оператор доступа к массиву или выражение CASE.

SELECT (ARRAY['Cat', 'Dog', 'Bird'])[2];
Dog

SQLite

Отсутствует. Применяется только CASE.

Язык программирования C#

Метод Enumerable.ElementAt или индексатор массива.

var items = new[] { "X", "Y", "Z" };
var result = items.ElementAt(1); // Индексация с 0
Y

Типичные ошибки

Неявное преобразование типа индекса

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

SELECT CHOOSE(3.7, 'A', 'B', 'C', 'D') AS RoundedIndex;
RoundedIndex
D

Несовместимые типы данных в списке значений

Приводят к ошибке преобразования типов.

SELECT CHOOSE(1, 'Text', 123, GETDATE());
-- Ошибка преобразования типа данных

Ожидание, что индексация начинается с 0

Индекс 1 соответствует первому значению в списке.

SELECT CHOOSE(0, 'First', 'Second') AS ZeroIndex;
ZeroIndex
NULL

История изменений

Функция CHOOSE была добавлена в SQL Server 2012. В более ранних версиях она недоступна. С момента введения синтаксис и поведение функции не претерпевали значительных изменений.

Расширенные примеры

Использование с функциями даты

Пример sql
SELECT DATENAME(MONTH, GETDATE()) AS LongName,
       CHOOSE(MONTH(GETDATE()), 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec') AS ShortName;
-- Результат зависит от текущей даты
LongName    ShortName
September   Sep

Динамическое формирование условия сортировки

Пример sql
DECLARE @SortOrder INT = 2;
SELECT ProductName, Price
FROM Products
ORDER BY
    CHOOSE(@SortOrder, ProductName, Price, ProductID);

Результат: сортировка по цене (второй параметр).

Эмуляция простого сопоставления с образцом

Пример sql
SELECT 
    StatusCode,
    CHOOSE(StatusCode + 1, 'Error', 'Pending', 'Active', 'Archived') AS StatusText
FROM Orders;
StatusCode StatusText
0          Error
1          Pending
2          Active

Вложенный вызов функции

Пример sql
SELECT CHOOSE(CHOOSE(2,1,2,3), 'Alpha', 'Beta', 'Gamma') AS Nested;
Nested
Gamma

Работа с NULL в качестве значения в списке

Пример sql
SELECT CHOOSE(2, 'Valid', NULL, 'Also Valid') AS ContainsNull;
ContainsNull
NULL

MS SQL CHOOSE function comments

En
CHOOSE Returns the item at the specified index from a list of values