Использование логических операций в условиях поиска
Вот последние четыре строки в описании синтаксиса предложения 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’ для дат рождения за пределами этого диапазона. Применение закона де Моргана в этом случае выполнит сам сервер базы данных.
Читайте также: B) Процесс передачи за плату или на льготных условиях государственной, муниципальной, коммунальной собственности частным лицам или коллективам. Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|