Как работает «в» предложение в оракуле

select 'true' from dual where 1 not in (null,1);

когда мы выполним это, что ничего не даст

что мой вопрос:

является ли приведенный выше запрос логически эквивалентным

select 'true' from dual where 1 != null and 1 != 1;

что ничего не даст, как вышеупомянутое утверждение

Просьба уточнить?

 Michael Berkowski03 июл. 2012 г., 14:51
И положительное состояниеIN() эквивалентно цепочкеOR =
 Michael Berkowski03 июл. 2012 г., 14:51
Да,NOT IN() логически эквивалентно цепочке!= AND !=.
 tbone03 июл. 2012 г., 15:17
@ypercube проблема с NOT IN и нулями. Я упоминаю, что НЕ В ПРОТИВ НЕ СУЩЕСТВУЕТ, потому что есть много хороших статей, которые обсуждают различия в том, как каждый рассматривает нули. Один пример:asktom.oracle.com/pls/apex/…
 tbone03 июл. 2012 г., 14:59
осторожно с NULL в вашем списке. NOT IN не будет возвращать строки из-за NULL. Многие дискуссии о NOT IN vs NOT EXISTS показывают эффект NULL.

Ответы на вопрос(4)

а NOT IN - это коллекция операторов AND, но он также не равен.

Таким образом, NOT IN эквивалентно:

1 <> NULL
AND 1 <> 1
AND ...

В то время как IN будет эквивалентно:

1 = NULL
OR 1 = 1
OR ...

Обратите внимание, что наличие NULL в коллекции не будет работать из-за необычной природы NULL.

 03 июл. 2012 г., 15:00
Я не уверен, как вы передаете значения, но для NULL вам необходимо явно указать & AND NOT IS NULL & quot;
 Maddy03 июл. 2012 г., 14:55
@ это означает, что когда коллекция содержит хотя бы один ноль, чем мы не можем использовать предложение IN?

ьзовать

column is null and column = 1

На самом деле NULL - это неопределенное значение. Любое сравнение с NULL не дает ни True, ни False, но NULL. ЧетноеNULL = NULL

Вот почему ваш1 not in (null,1) не работает.

 03 июл. 2012 г., 15:33
@ypercube Вы правы :-) Это моя вина.
 03 июл. 2012 г., 15:10
РезультатFalse на самом деле, в этом случае (из-за1 в списке).
Решение Вопроса

Правильно (но учтите, чтоIN является оператором, а не оператором, и он работает так в SQL вообще, не только для Oracle).

where 1 not in (null,1)

эквивалентно:

where 1 != null and 1 != 1

который действительно должен быть записан как:

WHERE 1 NOT IN (NULL, 1)

а также

WHERE 1 <> NULL AND 1 <> 1

что так же, как:

WHERE (1 <> NULL) AND (1 <> 1)

который оценивает:

WHERE UNKNOWN AND FALSE

и далее как:

WHERE FALSE

Таким образом, он правильно не возвращает строк.

Обратите внимание, что если бы вы имелиWHERE 1 NOT IN (NULL, 2)было бы оценитьWHERE UNKNOWN (оставлено как упражнение) и никакие строки не будут возвращены.

 Maddy03 июл. 2012 г., 15:04
@ypercube Большое спасибо
 03 июл. 2012 г., 15:02
+1, для1 <> NULL => UNKNOWN

Да.

select something from table where column not in (1,2,3);

эквивалентно

select something from table where column != 1 and column != 2 and column != 3;

Ваш ответ на вопрос