Введение в модель данных SQL

         

Выражения с переключателем


Выражения с переключателем в некотором смысле ортогональны рассмотренным выше видам выражений, поскольку разные выражения с переключателем могут вырабатывать значения разных типов в зависимости от типа данных элементов. Поскольку мы еще вообще не рассматривали этот вид выражений, обсудим их более подробно. Как обычно, начнем с синтаксиса:

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. Типы всех выражений, значения которых могут являться результатом выражения с поисковым переключателем, должны быть совместимыми, и типом результата является "наименьший общий" тип набора типов выражений-кандидатов на выработку результата1). Если в выражении отсутствует раздел 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

3 эквивалентно следующему выражению с переключателем:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2,... n) END.



Содержание раздела