Выражения с переключателем
Булевские выражения
К булевским выражениям относятся выражения, вырабатывающие значения булевского типа (напомним, что булевский тип языка SQL содержит три логических значения – true, false и unknown). Булевские выражения определяются следующими синтаксическими правилами:
boolean_value_expression ::= boolean_term
| boolean_value_expression OR boolean_term
boolean_term ::= boolean_factor
| boolean_term AND boolean_factor
boolean_factor ::= [ NOT ] boolean_test
boolean_test ::= boolean_primary [ IS [ NOT ] truth_value ]
truth_value ::= TRUE | FALSE | UNKNOWN
boolean_primary ::= predicate
| (boolean_value_expression)
| value_expression_primary
Выражения вычисляются слева направо с учетом приоритетов операций (наиболее приоритетна унарная операция NOT, следующим уровнем приоритета обладает “мультипликативная” операция конъюнкции AND, и самый низкий приоритет у “аддитивной” операции дизъюнкции OR) и круглых скобок. Операции IS и IS NOT определяются следующими таблицами истинности:
IS | TRUE | FALSE | UNKNOWN |
TRUE | TRUE | FALSE | FALSE |
FALSE | FALSE | TRUE | FALSE |
UNKNOWN | FALSE | FALSE | TRUE |
IS NOT | TRUE | FALSE | UNKNOWN |
TRUE | FALSE | TRUE | TRUE |
FALSE | TRUE | FALSE | TRUE |
UNKNOWN | TRUE | TRUE | FALSE |
Выражения с переключателем в некотором смысле ортогональны рассмотренным выше видам выражений, поскольку разные выражения с переключателем могут вырабатывать значения разных типов в зависимости от типа данных элементов. Поскольку мы еще вообще не рассматривали этот вид выражений, обсудим их более подробно. Как обычно, начнем с синтаксиса:
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 ≥ 3 эквивалентно следующему выражению с переключателем:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . n) END.