Выражения с переключателем в некотором смысле ортогональны рассмотренным выше видам выражений, поскольку разные выражения с переключателем могут вырабатывать значения разных типов в зависимости от типа данных элементов. Поскольку мы еще вообще не рассматривали этот вид выражений, обсудим их более подробно. Как обычно, начнем с синтаксиса:
case_expression ::= case_abbreviation | case_specification
case_abbreviation ::= NULLIF (value_expression , value_expression) | COALESCE (value_expression_comma_list) case specification ::= simple_case | searched_case
simple_case ::= CASE value_expression simple_when_clause_list [ ELSE value_expression ] END
searched_case ::= CASE searched_when_clause_list [ ELSE value_expression ] END simple_when_clause ::= WHEN value_expression THEN value_expression searched_when_clause ::= WHEN conditional_expression THEN value_expression
Наиболее общим видом выражения с переключателем является выражение с поисковым переключателем (searched_case). Правила вычисления выражений этого вида состоят в следующем. Вычисляется логическое выражение, указанное в первом разделе WHEN списка (searched_when_clause_list). Если значение этого логического выражения равняется true, то значением всего выражения с поисковым переключателем является значение выражения, указанного в первом разделе WHEN после ключевого слова THEN. Иначе аналогичные действия производятся для второго раздела WHEN и т. д. Если ни для одного раздела WHEN при вычислении логического выражения не было получено значение true, то значением всего выражения с поисковым переключателем является значение выражения, указанного в разделе ELSE. Типы всех выражений, значения которых могут являться результатом выражения с поисковым переключателем, должны быть совместимыми, и типом результата является «наименьший общий» тип набора типов выражений-кандидатов на выработку результата. Если в выражении отсутствует раздел ELSE, предполагается наличие раздела ELSE NULL.
В выражении с простым переключателем (simple_case) тип данных операнда переключателя (выражения, непосредственно следующего за ключевым словом CASE, назовем его CO – Case Operand) должен быть совместим с типом данных операнда каждого варианта (выражения, непосредственно следующего за ключевым словом WHEN; назовем WO – When Operand).
Выражение с простым переключателем
CASE CO WHEN WO1 THEN result1 WHEN WO2 THEN result2 . . . . . . . WHEN WOn THEN resultn ELSE result END
эквивалентно выражению с поисковым переключателем
CASE WHEN CO = WO1 THEN result1 WHEN CO = WO2 THEN result2 . . . . . . . WHEN CO = WOn THEN resultn ELSE result END
Выражение NULLIF (V1, V2) эквивалентно следующему выражению с переключателем:
CASE WHEN V1 = V2 THEN NULL ELSE V1 END.
Выражение COALESCE (V1, V2) эквивалентно следующему выражению с переключателем:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END.
Выражение COALESCE (V1, V2, . . . Vn) для n