Московский государственный университет имени М.В.Ломоносова
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 8465 / 635 | Оценка: 3.85 / 3.50 | Длительность: 22:03:00
Лекция 3:

Общая характеристика оператора SELECT и организация списка ссылок на таблицы в разделе FROM

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Выражения даты-времени

К выражениям даты-времени мы относим выражения, вырабатывающие значения типа дата-время и интервал. Выражения даты-времени определяются следующими синтаксическими правилами:

datetime_value_expression ::= 
	datetime_term
	  | interval_value_expression + datetime term
	  | datetime_value_expression + interval term
	  | datetime value expression - interval term
datetime_term ::= datetime_primary 
	[ AT { LOCAL | TIME ZONE interval_value_expression } ] 
datetime_primary ::= value_expression_primary 
	  | datetime_value_function

Как видно из описания синтаксиса, сами выражения строятся очень просто - на основе обычных арифметических операций. Снова более интересны первичные составляющие - вызовы функций, возвращающих значение дата-время. Эти вызовы определяются следующим синтаксисом:

datetime_value_function ::= CURRENT_DATE
	| CURRENT_TIME [ (precision) ]
	| LOCALTIME [ (precision) ]
	| CURRENT_TIMESTAMP [ (precision) ]
	| LOCALTIMESTAMP [ (precision) ]

Видимо, приведенные синтаксические правила не нуждаются в комментариях: можно получить текущую дату, а также текущее время с желаемой точностью. Отличие функций LOCALTIME и LOCALTIMESTAMP от CURRENT_TIME и CURRENT_TIMESTAMP, соответственно, состоит в том, что первая пара функций не возвращает смещение локального времени от Гринвича.

Синтаксис выражений со значениями типа интервал определяется следующими правилами:

interval_value_expression ::= 
	  interval_term
	| interval_value_expression + interval term 
	| interval_value_expression - interval term
	| (datetime value expression - datetime term) 
	  interval_qualifier
interval_term ::= interval_factor
	| interval_term * numeric_factor
	| interval_term / numeric_factor
	| numeric_term * interval_factor

interval_factor ::= [ { + | - } ] 
	  interval_primary [ <interval qualifier> ] 
interval_primary ::= value_expression_primary
	| interval_value_function

Как видно из приведенных правил, выражения со значениями типа интервал устроены очень просто; почти вся содержательная информация была приведена при обсуждении соответствующего типа данных. Стоит только заметить, что квалификатор интервала указывается для того, чтобы явно специфицировать единицу измерения интервала. Поддерживается только одна функция ABS (абсолютное значение), аргументом которой является выражение со значением типа интервал.

Булевские выражения

К булевским выражениям относятся выражения, вырабатывающие значения булевского типа (напомним, что булевский тип языка 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. Типы всех выражений, значения которых могут являться результатом выражения с поисковым переключателем, должны быть совместимыми, и типом результата является "наименьший общий" тип набора типов выражений-кандидатов на выработку результата3Для набора типов T1, T2, …, Tn, будем называть тип T, если значения каждого из типов T1, T2, …, Tn неявно приводимы к типу T, и не существует типа T', такого, что значения типов T1, T2, …, Tn неявно приводимы к типу T', и значения типа T' неявно приводимы к типу T .. Если в выражении отсутствует раздел 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.
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Алексей Ковтун
Алексей Ковтун

При попытке исполнения запроса:

CREATE DOMAIN EMP_NO AS INTEGER

    CHECK (VALUE BETWEEN 1 AND 10000);

Выдается ошибка: Неизвестный тип объекта "DOMAIN" в интсрукции CREATE, DROP или ALTER. 

Используется SQL Server MS SQL 2008R2

Александра Каева
Александра Каева