Скачиваний:
60
Добавлен:
01.04.2014
Размер:
627.71 Кб
Скачать

8.6. Условные выражения

Как и табличные выражения, условные выражения встречаются в многочислен­ных контекстах языка SQL и, в частности, используются в инструкции where с целью включения или исключения строк для последующей обработки. Обсудим некоторые наиболее важные свойства таких выражений. При этом обратите вни­мание, что наша трактовка, несомненно, не претендует на исчерпывающую; в ча­стности, мы пропускаем все, что касается null-значений. (Условные выражения, возможно, больше остальных элементов языка требуют расширенного рассмот­рения, если учитывать наличие null-значений и сложность вопросов, связанных с ними. Кроме того, здесь не рассматриваются определенные форматы условных выражений, предназначенные исключительно для определенных аспектов под­держки null-значений.)

Как и выше, начнем с BNF-грамматики (рис. 8.2). Читатель убедится, что боль­шинство форматов условных выражений или уже были проиллюстрированы в преды­дущих разделах, или понятны сами по себе; здесь же просто делается попытка в не­скольких словах дать пояснения относительно таких характерных случаев, как усло­вия match и "все-или-какой-нибудь".

conditional-expression

: := conditional-term

I conditional-egression OR conditional-term

conditional-term

: := conditional-factor

I conditional- term AND conditional-factor

conditional-factor

: :=[ NOT ] conditionaI-primary

conditional -primary

: := simple-condition | ( conditional-egression )

simple-condition

: := comparison-condition

| in-condition

| match-condition

| all-or-any-condition

| exists-condition

comparison-condition

: := row-constructor comparison-operator row-constructor

comparison-operator

: := = | < | <= | > | >= | <>

in-condition

: := row-constructor [ NOT ] IN ( table-expression )

I scalar-expression [ NOT ] IN

( scalar-expression-commalist )

match-condition

: := row-constructor MATCH UNIQUE ( table-expression )

all-or-any-condition

: := row-constructor

comparison-operator ALL ( table-expression )

I row-constructor

comparison-operator ANY ( table-expression )

exists-condition

: := EXISTS ( table-expression )

Рис. 8.2.BNF-грамматика для условных выражений SQL

Условие MATCH

Условие match имеет следующий вид:

row-constructor MATCH UNIQUE ( tabIe-expression )

Пусть r1 это строка, полученная в результате вычисления row-constructor, и пусть Т— таблица, полученная в результате вычисления table-expression. Тогда вы­числение условия match будет давать истину тогда и только тогда, когда таблица T бу­дет содержать ровно одну строку, скажем r2, такую, что сравнение

r1=r 2

будет давать истину. Вот один пример:

SELECT SP.*

FROM SP

WHERE NOT ( SP.S# MATCH UNIQUE ( SELECT S.S# FROM S ) ) ;

("Получить поставки, которые не имеют ровно одного соответствующего поставщика в таблице поставщиков"). Такой запрос может быть полезен при проверке целостно­сти базы данных, поскольку если база данных корректна, то не должно быть ни одной такой поставки. Заметьте, что для выполнения такой же проверки могло быть исполь­зовано условие in.

Кстати, ключевое слово unique из инструкции match unique можно опустить, но то­гда match превращается в синоним слова in (по крайней мере, при отсутствии null-значений).

Условие "все-или-какой-нибудь"

Условие "все-или-какой-нибудь" имеет такую общую форму:

row-constructor

comparison-operator qualifier ( table-expression )

Здесь оператор сравнения (comparison-operator) берется из обычного набора (=, <> и т.д.), а квантор (qualifier)— это ключевое слово all (все) или any (какой-нибудь, суще­ствует хотя бы один). В общем, условие "все-или-какой-нибудь" дает значение истина то­гда и только тогда, когда соответствующее сравнение без квантора all (или any) дает зна­чение истина для всех (или соответственно для какой-нибудь) строк (строки) таблицы, представляемой выражением table-expression. (Если эта таблица пустая, то условие с квантором all имеет значение истина, а с квантором any — ложь.) Приведем пример ("Получить названия таких деталей, вес которых больше веса любой голубой детали"):

SELECT DISTINCT PX.PNAME

FROM P AS PX

WHERE PX.WEIGHT > ALL ( SELECT PY.WEIGHT

FROM P AS PY

WHERE PY.COLOR = 'Blue' ) ;

Результат будет выглядеть следующим образом:

Пояснения. Вложенное табличное выражение возвращает множество весов голу­бых (Blue) деталей, а именно множество {17, 12}. Тогда внешнее выражение select возвращает название только одной детали (а именно детали Р6), вес которой больше каждого значения в этом множестве. В общем случае, конечно, результат может со­держать любое количество деталей (включая нуль).

Соседние файлы в папке Дейтл Введ в БД