В WHERE
предложении SQL-запроса я ожидаю, что эти два условия будут иметь одинаковое поведение:
NOT (a=1 AND b=1)
против
a<>1 AND b<>1
Первое условие ведет себя так, как и ожидалось, и, хотя я и предполагаю, что второе условие делает то же самое, оно не выполняется
Это очень простые вещи, но стыдно, я не вижу, что я делаю неправильно.
a <> 1 OR b<>1
.Ответы:
Они не эквивалентны.
эквивалентно с:
Эта эквивалентность известна как
De Morgan's Law
. Смотрите, например:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Хорошим методом доказательства / опровержения эквивалентностей для выражений булевой алгебры является использование cte для доменов и сравнение выражений рядом друг с другом:
Изменить: Поскольку DB2 не поддерживает логический тип данных, я расширил пример на:
http://sqlfiddle.com/#!15/25e1a/19
Переписанный запрос выглядит так:
Результат запроса:
Как показано, exp1 и exp2 эквивалентны.
источник
with T(a) as ( values 0,1,NULL )
и повторно запустите запрос, и вы увидите, что произойдет. NULL определенно выбрасывает ключ в большинстве изучаемых нами правил эквивалентности множеств. Краткий ответ a = NULL и a < > NULL оба дают NULL, поэтому они перейдут к другому случаю. Для дальнейшего чтения: ( stackoverflow.com/questions/1833949/… )Ваш первый пример говорит:
Ваш второй пример говорит:
Чтобы второй запрос возвращал то же, что и первый, вы должны изменить
AND
его наOR
Это возвращает следующие результаты
источник
a<>1 AND b<>1
переводится как «либо a = 1 ИЛИ b = 1»?NOT ( a=1 OR b=1 )
. Прискорбные естественные языки содержат неоднозначности, которые затрудняют перевод логических формул на естественные языки и наоборот. Например,neither a=1 nor b=1
значитNOT ( a=1 OR b=1 )
или(NOT a=1) OR (NOT b=1)
?