Правильная ссылка на эту страницу
http://az-design.ru/Support/DataBase/SQL/CelkoJ/01h010.shtml

Глава 10. Сравнение или операции Theta

       В своих ранних статьях доктор Кодд ввел термин "theta-операции" для обозначения того, что некоторые программисты называют операциями предикатов сравнения. Большое количество типов данных SQL затрудняет сравнения в отличие от других языков программирования. Дело в том, что сначала значения одного из типов данных надо преобразовать к другому. Доступные типы данных зависят от реализации и оборудования, поэтому необходимо обратиться к руководствам по работе с вашим продуктом.
       Операции сравнения можно перегружать, они работают с типами данных <numeric>, <character> и <datetime>. Обозначение и смысл операций сравнения показаны в следующей таблице:

<numeric> <character> <datetime> <operates>
<: меньше чем (порядок следования до) (раньше чем)
=: равно (порядок тот же) (в то же время)
>: больше чем (порядок следования
после)
позже чем
<=: не больше (порядок до или
в то же время)
(происходит раньше
или в то же время)
<>: не равно (порядок не тот
же самый)
(время не совпадает)
>=: не меньше (позже или в то же
время)
(происходит позже
или в то же время)

В старых реализациях SQL встречаются также операции != или ~=, обозначающие "не равно". Они позаимствованы соответственно из языков С и PL/I и никогда не входили в состав стандарта SQL. He советую вам использовать эти операции, так как они нарушают переносимость кода и затрудняют его чтение.

10.1. Преобразования типов данных

       Числовые типы данных (NUMERIC) взаимно сравнимы и взаимозаменяемы. Если в результате присваивания теряются наиболее значащие цифры, генерируется исключительная ситуация. При потере наименее значащих цифр в соответствии с данной реализацией происходит округление или усечение, и исключительная ситуация не генерируется. Чаще всего одно значение преобразуется к тому же типу данных, что и другое, а затем сравнение производится обычным способом. При этом выбирается тот тип данных, который является более старшим в последовательности SMALLINT, INTEGER, DECIMAL, NUMERIC, REAL, FLOAT,DOUBLE PRECISION.
       Очень часто на процесс сравнения чисел типа REAL, FLOAT и DOUBLEPRECISION влияют возможности оборудования для работы с числами с плавающей точкой. Иногда избежать этого не удается, так как не всегда можно обойтись только типами DECIMAL или NUMERIC. В базовом языке используется, как правило, то же самое оборудование, поэтому ошибки в приложении будут появляться одинаковые.
       Типы CHARACTER и CHARACTER VARYING сравнимы, если только они взяты из одного и того же набора символов. Это значит, что символы ASCII нельзя сравнивать с графическими символами, английские символы с арабскими и т.д. В большинстве реализаций это не представляет проблемы, поскольку БД использует только один набор.
       При сравнении более короткая строка дополняется пробелами до более длинной. В большинстве случаев строки затем сравниваются слева направо посимвольно, используя последовательность ASCII или EBCDIC.
       Временные (или datetime — дата и время, как их называют в стандарте) типы данных взаимозаменяемы, только если источник и цель содержат одни и те же поля даты и времени. Это значит, что, например, нельзя сравнивать дату и время. Для явного преобразования типов перед началом сравнения можно воспользоваться оператором CAST(). Далее приводится таблица допустимых комбинаций исходных и целевых типов данных в SQL-92. Буква Y означает, что комбинация синтаксически допустима без ограничений; М — что она допустима в зависимости от других синтаксических правил; N— что она недопустима.

<value
ехрr>
<cast target>
  EN AN VC FC VB FB D T TS YM DT
EN Y Y Y Y N N N N N M M
AN Y Y Y Y N N N N N N N
С Y Y M M Y Y Y Y Y Y Y
В N N Y Y Y Y N N N N N
D N N Y Y N N Y N Y N N
Т N N Y Y N N N Y Y N N
TS N N Y Y N N Y Y Y N N
YM M N Y Y N N N N N Y N
DT M N Y Y N N N N N N Y

Здесь:
       EN — точные числа
       AN — приближенные числа
       С — символьное поле (фиксированной или переменной длины)
       FC — символьное поле фиксированной длины
       VC — символьное поле переменной длины
       В — битовая строка (фиксированной или переменной длины)
       FB — битовая строка фиксированной длины
       VB — битовая строка переменной длины
       D — дата
       Т — время
       TS — отметка времени
       YM — интервал год-месяц
       DT — интервал дата-время

10.2. Сравнение строк в стандарте SQL-92

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

А = (10, 20, 30, 40); 
В = (10, NULL, 30, 40); 
С = (10, NULL, 30, 100);

       Кажется разумным определить, что общее сравнение имеет смысл, только если типы данных каждого соответствующего столбца в строках совместимы по объединению. Если нет, операция будет ошибочной и должна вывести об этом предупреждение. Также кажется разумным, что результаты сравнения представляют собой пересечение результатов сравнения всех соответствующих столбцов с помощью одной и той же операции. Это означает, что сравнение (А = В) превратится в:

((10, 20, 30, 40)  = (10, NULL, 30, 40));

       Затем:

((10  = 10) AND (20 = NULL) AND (30 = 30) AND (40 = 40));

       Затем:

(TRUE AND UNKNOWN AND TRUE AND TRUE);

       И, наконец:

(UNKNOWN);

       Такое сравнение кажется правильным. Оно соответствует представлению о том, что NULL является отсутствующим значением, которое мы ожидаем узнать в будущем, так что пока не можем сделать никаких выводов о результатах сравнения. Теперь сравним (Л = С). Это выражение преобразуется следующим образом:

((10, 20, 30, 40) = (10, NULL, 30, 100)),

       Затем:

((10 = 10) AND (20 = NULL) AND (30 = 30) AND (40 = 100));

       Затем:

(TRUE AND UNKNOWN AND TRUE AND FALSE);

       И, наконец:

(FALSE);

       Во втором столбце строки С не может оказаться такое значение, чтобы результат стал бы TRUE, поскольку четвертое сравнение всегда равно FALSE. Таким образом, первый случай дает TRUE или FALSE, а второй — всегда FALSE.
       В соответствии со стандартом SQL-92 theta-операции работают так, как показано ниже. Выражение RX <comp op> RY означает, что строка RX сравнивается со строкой RY. RXi означает i-тый столбец строки RX. Если не обнаружено ошибки в соответствии типов, то результатом может быть TRUE, FALSE или UNKNOWN. Правила способствуют надежной проверке значений TRUE или FALSE, UNKNOWN получается только в крайнем случае.
       Смысл этих правил заключается в том, что при чтении строк слева направо значения в одной строке будут всегда больше (или меньше) значений в другой, начиная с некоторого столбца. Именно так они выполняются при расположении слов в алфавитном порядке.
       1. Утверждение RX = RY имеет значение TRUE, если и только если для вcex iRXi = RYi.
       2. Утверждение RX <> RY имеет значение TRUE, если и только если для некоторого r RXi <> RYi.
       3. Утверждение RX < RY имеет значение TRUE, если и только если для всех i < n RXi = RYi и для некоторого n RXn < RYn.
       4. Утверждение RX > RY имеет значение TRUE, если и только если длявсех i < n RXi = RYi и для некоторого n RXn > RYn.
       5. Утверждение RX <= RY имеет значение TRUE, если и только если Rx = Ry или Rx < Ry.
       6. Утверждение RX >= RY имеет значение TRUE, если и только если Rx = Ry или Rx > Ry.
       7. Утверждение RX = RY имеет значение FALSE, если и только если выражение RX <> RY равно TRUE.
       8. Утверждение RX <> RY имеет значение FALSE, если и только если выражение RX = RY равно TRUE.
       9. Утверждение RX < RY имеет значение FALSE, если и только если выражение RX >= RY равно TRUE.
       10. Утверждение RX > RY имеет значение FALSE, если и только если выражение RX <= RY равно TRUE.
       11. Утверждение RX <= RY имеет значение FALSE, если и только если выражение RX > RY равно TRUE.
       12. Утверждение RX >= RY имеет значение FALSE, если и только если выражение RX < RY равно TRUE.
       13. Утверждение RX <comp op> RY имеет значение UNKNOWN, если и только если оно не равно ни TRUE, ни FALSE.
       Операция отрицания NOT обладает своими обычными свойствами. Имейте в виду: наличие в строке NULL-значения приведет к тому, что результат сравнения станет UNKNOWN. Такие сравнения строк допустимы в стандарте SQL-89, но трансляция предикатов осуществляется чрезвычайно сложно.
       Рассмотрим работу в стандарте SQL-92 со следующим выражением:

(a, b, с) < (х, у, z) 

       Оно примет вид:

((а < х)
  OR ((a=x) AND (b<y))
  OR ((a=x) AND (b=y) AND (c<z)))

       Стандарт SQL-89 позволял использовать в правой части предикатов <comp op> ALL <subquery> и <сотр ор> SOME <subquery> только скалярные подзапросы, а в левой части — однозначные выражения. SQL-92 допускает использование в левой части однострочных выражений любого типа, включая однострочные подзапросы. Аналогично в этой версии стандарта предикат BETWEEN разрешает использование строковых выражений в любом месте.




<<< Пред. Оглавление
 
След. >>>

Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:55 MSK


Постоянный адрес статьи:
http://az-design.ru/Support/DataBase/SQL/CelkoJ/01h010.shtml