Оглянись на формальную логику и алгебру.Выражение типа
A & B & (D | E)
может быть отменено несколькими способами:
Очевидный путь:
!( A & B & ( D | E ) )
Вышесказанное также можно переформулировать, вам просто нужно запомнить некоторые свойства логических выражений:
!( A & B )
эквивалентно (!A | !B)
. !( A | B )
isэквивалент (!A & !B)
. !( !A )
является эквивалентом (A).
Распределить NOT (!) по всему выражению, к которому он применяется, инвертируя операторыи устранение двойных негативов по мере продвижения:
!A | !B | ( !D & !E )
Таким образом, в общем случае любое условие where может быть отменено в соответствии с вышеуказанными правилами.Отрицание этого
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
равно
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
или
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Что лучше?Это очень контекстно-зависимый вопрос.Только вы можете решить это.
Имейте в виду, что использование NOT может повлиять на то, что оптимизатор может или не может делать.Вы можете получить неоптимальный план запроса.