Допустимые предикаты и условия поиска
Внешне предикаты, которые можно использовать в условиях поиска 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>
Пояснения:
(a) если XV и/или YV являются неопределенными значениями, то значение условия "X <compop> Y" есть unknown;
(b) если XV и YV не являются неопределенными значениями, то значением условия "X <compop> Y" является true или false в соответствии с естественными правилами применения операции сравнения.
(a) если длина в символах строки X не равна длине строки Y, то для выравнивания длин строк более короткая строка расширяется символом набивки (padsymbol); если не используется явно специфицируемый порядок сортировки для используемого набора символов, то в качестве символа набивки используется пробел;
(b) далее производится лексикографическое сравнение строк в соответствии с предопределенным или явно определенным порядком сортировки символов.
(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).
(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.