Допустимые предикаты и условия поиска
Внешне предикаты, которые можно использовать в условиях поиска SQL/92, очень похожи на предикаты SQL/89. Но, во-первых, ассортимент допустимых предикатов расширен, а во-вторых, возможности задания условий "старых" предикатов стали существенно шире. Поэтому мы перечислим все возможные предикаты с приведением их синтаксиса и кратких пояснений. В конце раздела будут приведены правила формулировки и семантика условий поиска.
Предикат позволяет специфицировать условие, результатом вычисления которого может быть true, false или unknown. В языке SQL/92 допустимы следующие предикаты:
<predicate> ::= <comparison predicate> |<between predicate> |<in predicate> |<like predicate> |<null predicate> |<quantified comparison predicate> |<exists predicate> |<unique predicate> |<match predicate> |<overlaps predicate>
3.4.1. Предикат сравнения
В SQL/92 этот предикат предназначен для спецификации сравнения двух строчных значений. Синтаксис предиката следующий:
<comparison predicate> ::= <row value constructor> <comp op> <row value constructor> <comp op> ::= <equals operator> |<not equals operator> |<less than operator> |<greater than operator> |<less than or equals operator> |<greater than or equals operator>
Пояснения:
Строки-операнды должны быть одинаковой степени. Типы данных соответствующих значений строк-операндов должны быть совместимы. Пусть X и Y обозначают соответствующие элементы строк-операндов, а XV и YV - их значения
(a) если XV и/или YV являются неопределенными значениями, то значение условия "X <compop> Y" есть unknown;
(b) если XV и YV не являются неопределенными значениями, то значением условия "X <compop> Y" является true или false в соответствии с естественными правилами применения операции сравнения.
Числа сравниваются в соответствии с алгебраическими значениями. Сравнение двух текстовых строк производится следующим образом:
(a) если длина в символах строки X не равна длине строки Y, то для выравнивания длин строк более короткая строка расширяется символом набивки (padsymbol); если не используется явно специфицируемый порядок сортировки для используемого набора символов, то в качестве символа набивки используется пробел;
(b) далее производится лексикографическое сравнение строк в соответствии с предопределенным или явно определенным порядком сортировки символов.
Сравнение двух битовых строк X и Y основано на сравнении соответствующих бит. Если Xi и Yi - значения i-тых бит X и Y соответственно и если LX и LY обозначает длину в битах X и Y соответственно, то
(a) X равно Y тогда и только тогда, когда LX = LY и Xi = Yi для всех i;
(b) X меньше Y тогда и только тогда, когда
(i) LX < LY и Xi = Yi для всех i меньших или равных LX, или
(ii) Xi = Yi для всех i < n и Xn = 0, а Yn =1 для некоторого n меньшего или равного min (LX,LY).
Сравнение двух значений типа дата-время производится в соответствии с видом интервала, получающегося при вычитании второго значения из первого. Пусть X и Y - сравниваемые значения, а H - наименее значимое поле даты-времени X и Y. Результат сравнения X <compop> Y определяется как (X - Y) H <compop> INTERVAL (0) H. (Два значения типа дата-время сравнимы только в том случае, если они содержат одинаковый набор полей даты-времени.) Пусть Rx и Ry обозначают строки-операнды, а RXi и RXi - i-тые элементы Rx и Ry соответственно. Результат сравнения "Rx <compop> Ry" определяется следующим образом:
(a) "Rx = Ry" есть true тогда и только тогда, когда RXi = RYi для всех i;
(b) "Rx <> Ry" есть true тогда и только тогда, когда RXi <> RYi для некоторого i;
(c) "Rx < Ry" есть true тогда и только тогда, когда RXi = RYi для всех i < n, и RXn < RYn для некоторого n;
(d) "Rx > Ry" есть true тогда и только тогда, когда RXi = RYi для всех i < n, и RXn > RYn для некоторого n;
(e) "Rx <= Ry" есть true тогда и только тогда, когда Rx = Ry или Rx < Ry;
(f) "Rx >= Ry" есть true тогда и только тогда, когда Rx = Ry или Rx > Ry;
(g) "Rx = Ry" есть false тогда и только тогда, когда "Rx <> Ry" есть true.
(h) "Rx <> Ry" есть false тогда и только тогда, когда "Rx = Ry" есть true.
(i) "Rx < Ry" есть false тогда и только тогда, когда "Rx >= Ry" есть true.
(j) "Rx > Ry" есть false тогда и только тогда, когда "Rx <= Ry" есть true.
(k) "Rx <= Ry" есть false тогда и только тогда, когда "Rx > Ry" есть true.
(l) "Rx >= Ry" есть false тогда и только тогда, когда "Rx < Ry" есть true.
(m) "Rx <compop> Ry" есть unknown тогда и только тогда, когда "Rx <compop> Ry" не есть true или false.