Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Использование логических операций в условиях поиска




Вот последние четыре строки в описании синтаксиса предложения WHERE:

...

| (<условия поиска>)

| NOT <условия поиска>

| <условия поиска> OR <условия поиска>

| <условия поиска> AND <условия поиска>

Это означает, что любую правильную часть условия можно заключать в круглые скобки и что можно строить сколь угодно сложные логические условия, используя операции отрицания (NOT), дизъюнкции (OR) и конъюнкции (AND).

Следует быть аккуратным при построении сложных логических условий, особенно если вам нужно выполнить некоторые преобразования условий, содержащих отрицание. Люди часто допускают здесь ошибки.

В математической логике существует два замечательных закона де Моргана1, которые позволяют выполнить преобразование отрицания конъюнкции и отрицания дизъюнкции. Законы простые:

NOT (A AND B) = NOT (A) OR NOT (B)

NOT (A OR B) = NOT (A) AND NOT (B)

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

ЗАМЕЧАНИЕ

Тот факт, что в SQL используется не двухзначная, а трехзначная логика, ничего не меняет в используемых нами законах исчисления высказываний. В случае допустимости у столбцов пустых значений мы должны лишь проверить нужные нам столбцы на NULL. Этого достаточно.

Рассмотрим пример. Чуть раньше мы отображали список тех, чья дата рождения находится в диапазоне от 1.01.1960 до 31.12.1969. Мы использовали следующий оператор:

SELECT PR_NAME2 AS "Имя",

PR_NAME3 AS "Отчество",

PR_NAME AS "Фамилия",

PR_BIRTHDAY AS "Дата рождения"

FROM PERSON

WHERE PR_BIRTHDAY >= '1.01.1960' AND PR_BIRTHDAY <= '31.12.1969'

 

Если же нам нужен список людей с датами рождения, не входящими в этот диапазон (то есть находящимися в точности за пределами этого диапазона), то мы должны выполнить отрицание выражения:

PR_BIRTHDAY >= ' 1.01.1960’ AND PR_BIRTHDAY <= ‘31.12.1969’

В соответствии с законом де Моргана мы получаем оператор:[23]

SELECT PR_NAME2 AS "Имя",

PR_NAME3 AS "Отчество",

PR_NAME AS "Фамилия",

PR_BIRTHDAY AS "Дата рождения"

FROM PERSON

WHERE ( PR_BIRTHDAY < '1.01.1960' OR PR_BIRTHDAY > '31.12.1969' )

Здесь нам нужно выполнить отрицание нашего выражения, задающего условия для окладов сотрудников. Отрицанием для операции сравнения >= будет < (или!>= или ^>=), для операции <= отрицанием будет > (!<=, ^ <=). Конъюнкцию мы меняем на дизъюнкцию.

Если кому-то вдруг по непонятной причине не очень нравится использование фактов из математической логики, то в данном случае легко можно использовать вариант BETWEEN, что мы и делали раньше:

PR_BIRTHDAY BETWEEN '1.01.1960’ AND ‘31.12.1969’

для задания первоначального диапазона и

PR_BIRTHDAY NOT BETWEEN '1.01.1960’ AND ‘31.12.1969’

для дат рождения за пределами этого диапазона. Применение закона де Моргана в этом случае выполнит сам сервер базы данных.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...