Справочная статья
Оператор SELECT CASE
Когда действие выбирается по одному значению — коду, категории, диапазону или строке, — цепочка сравнений заставляет повторять это значение в каждом условии. SELECT CASE записывает выражение выбора один раз, а ветви CASE перечисляют его варианты: отдельные значения, диапазоны и проверки отношения. Выполняется первая подошедшая ветвь.
Когда нужен SELECT CASE
Оператор работает на верхнем уровне программы и внутри подпрограмм и блоков, в консольной и графической программе. Специальный графический режим не требуется. Конструкция удобна для выбора по коду, категории или диапазону. В отличие от цепочки независимых условий, выражение выбора записывается один раз.
Синтаксис
SELECT CASE <выражение выбора>
CASE <список селекторов>
⟦<операторы>⟧
⟦CASE <список селекторов>
⟦<операторы>⟧⟧
⟦CASE ELSE
⟦<операторы>⟧⟧
END SELECTВыражение выбора и селекторы
После SELECT CASE записывается выражение выбора типа INTEGER, LONG, DOUBLE, DECIMAL, STRING, BOOLEAN, DATE, TIME или DATETIME. Список селекторов задаёт варианты проверки, а операторы задают действия выбранной ветви. Значение каждого селектора должно допускать соответствующее сравнение с выражением выбора. Каждая ветвь CASE задаёт один или несколько селекторов через запятую. Точное значение проверяет равенство. Начало и конец диапазона TO задают включённые нижнюю и верхнюю границы; обратный диапазон не подходит ни одному значению. Оператор сравнения в форме IS задаёт одну из поддержанных проверок отношения выражения выбора к значению селектора. Числовые селекторы приводятся к типу выражения выбора; это может усечь дробную часть или вызвать переполнение.
Селектор внутри CASE может быть записан одной из следующих форм:
CASE <значение>
CASE <значение 1>, <значение 2>, <значение 3>
CASE <начало> TO <конец>
CASE IS <оператор сравнения> <значение>
Формы различаются способом проверки. CASE <значение> выбирает ветвь при точном совпадении с выражением выбора. Список через запятую выбирает ветвь, если подошёл хотя бы один селектор из списка. CASE <начало> TO <конец> задаёт включительный диапазон. CASE IS задаёт сравнение с выбранным значением через =, <>, <, <=, > или >=.
Для временного выражения выбора действует собственный договор. Точное значение, CASE IS и диапазон TO допустимы для одного вида: DATE сравнивается с DATE, TIME с TIME, DATETIME с DATETIME. Селектор того же вида сравнивается напрямую, а строковый селектор разбирается в вид выражения выбора по канонической записи. Смешение видов отклоняется как несовместимые типы, как и в DATEADD, DATEDIFF и DATEPART. Полный текст даты-времени в селекторе для DATE или TIME отвергается: потеря компонента здесь так же запрещена, как в присваивании, поэтому для сужения используют DATEVALUE или TIMEVALUE. Доли секунды участвуют в сравнении, поэтому значения, различающиеся только дробной частью, попадают в разные ветви.
Порядок выполнения
Выражение выбора вычисляется один раз. Ветви проверяются по порядку до первого совпадения. Выполняется только выбранный блок, после чего управление переходит ниже END SELECT. В следующем примере выражение равно восьми: ветвь с селекторами 1, 5 TO 10 и IS > 100 подошла по диапазону, поэтому выполнилась она, а CASE ELSE остался без работы.
DIM value AS INTEGER = 8
SELECT CASE value
CASE 1, 5 TO 10, IS > 100
PRINT "Подходит"
CASE ELSE
PRINT "Другой вариант"
END SELECTРезультат:
ПодходитЕсли совпадений нет, выполняется CASE ELSE, когда эта ветвь присутствует. Допускается только одна такая ветвь. Без неё программа продолжает работу после конструкции.
Точное совпадение поддержано для чисел, строк и BOOLEAN. Диапазоны и упорядоченные сравнения поддержаны для числовых и строковых значений. Каждая ветвь имеет собственную область видимости.
Диагностика
MB2015— диапазонCASE ... TOиспользуется с типом, для которого диапазоны не поддержаны.MB2003— селектор или сравнение несовместимы с типом выражения выбора.MB2001— имя, объявленное внутри ветви, используется после выхода из области видимости.MB1006— в конструкцииSELECT CASEдопускается только один блокCASE ELSE.
Запускаемые примеры
Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.
- SELECT CASE: точные значения
- SELECT CASE: временные значения
- SELECT CASE: диапазоны и CASE IS
- SELECT CASE: смешанные селекторы
- SELECT CASE: строковые значения
- SELECT CASE: строковые диапазоны
- SELECT CASE: логические значения
- SELECT CASE: первая подошедшая ветвь
- SELECT CASE: продолжение без совпадения