CHOOSE: примеры (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); // Индексация с 0Y
Типичные ошибки
Неявное преобразование типа индекса
Если индекс является числом с плавающей точкой, происходит неявное преобразование, что может привести к неожиданному округлению.
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. В более ранних версиях она недоступна. С момента введения синтаксис и поведение функции не претерпевали значительных изменений.
Расширенные примеры
Использование с функциями даты
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
Динамическое формирование условия сортировки
DECLARE @SortOrder INT = 2;
SELECT ProductName, Price
FROM Products
ORDER BY
CHOOSE(@SortOrder, ProductName, Price, ProductID);Результат: сортировка по цене (второй параметр).
Эмуляция простого сопоставления с образцом
SELECT
StatusCode,
CHOOSE(StatusCode + 1, 'Error', 'Pending', 'Active', 'Archived') AS StatusText
FROM Orders;StatusCode StatusText 0 Error 1 Pending 2 Active
Вложенный вызов функции
SELECT CHOOSE(CHOOSE(2,1,2,3), 'Alpha', 'Beta', 'Gamma') AS Nested;Nested Gamma
Работа с NULL в качестве значения в списке
SELECT CHOOSE(2, 'Valid', NULL, 'Also Valid') AS ContainsNull;ContainsNull NULL