Axiom Справочник языка

Справочная статья

Оператор 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 и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.

См. также