Введение в стандарты языка баз данных SQL

Допустимые предикаты и условия поиска


Внешне предикаты, которые можно использовать в условиях поиска 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.




  • Содержание раздела