Это то же самое, что и ответ Майкла Бротона, и я ненавижу дублировать, но я подумал, что это может быть яснее. Если он хочет включить что-либо из этого в свой ответ, я с радостью его удалю.
Чтобы определить логический эквивалент НЕ (boolean_expression), вы можете применить l aws Де Моргана. См .: https://en.wikipedia.org/wiki/De_Morgan%27s_laws
По сути, вы меняете логику c каждого термина и заменяете все И на ИЛИ, а все ИЛИ на И. Итак,
NOT (A AND B AND C) ==> (NOT A OR NOT B OR NOT C)
Но вам также нужно отслеживать нули. Вот процесс:
Начиная с ...
HAVING NOT (flag_1 = 1 AND flag_2 = 1 AND flag_3 = 1)
Сначала добавьте неявные предположения о NULL, которые существуют в начальном выражении. Например, если flag_1=1
, то это, конечно, не NULL.
HAVING NOT (flag_1 = 1 AND flag_1 IS NOT NULL
AND flag_2 = 1 AND flag_2 IS NOT NULL
AND flag_3 = 1 AND flag_3 IS NOT NULL)
Теперь примените первую часть l aws де Моргана и поменяйте логики c каждого термина. Так, например, flag_1 = 1
становится flag_1 != 1
...
HAVING (flag_1 != 1 AND flag_1 IS NULL
AND flag_2 != 1 AND flag_2 IS NULL
AND flag_3 != 1 AND flag_3 IS NULL)
Наконец, примените вторую часть l aws де Моргана и переключите все ANDs-> ORs и наоборот. ..
HAVING (flag_1 != 1 OR flag_1 IS NULL
OR flag_2 != 1 OR flag_2 IS NULL
OR flag_3 != 1 OR flag_3 IS NULL)
И вот ваш ответ.
Как насчет просто NOT (flag_1 = 1 AND flag_2 = 1 AND flag_3 = 1)
?
Это не работает, потому что не обрабатывает нулевые значения, как если бы ожидать. В Oracle любое сравнение с нулем ложно. Итак,
(1 = NULL) ... false
NOT (1 = NULL) ... also false
Таким образом, строка с flag_1
и flag_2
, равными 1, но flag_3
null, НЕ будет отображаться в ваших результатах.