Вопрос по oracle, oracle10g, sql, sql-server – Как работает «в» предложение в оракуле

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

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

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

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

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

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

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

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

Ваш Ответ

4   ответа
2

Да.

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

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

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

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

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

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

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

1 = NULL
OR 1 = 1
OR ...

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

Я не уверен, как вы передаете значения, но для NULL вам необходимо явно указать & AND NOT IS NULL & quot;
@ это означает, что когда коллекция содержит хотя бы один ноль, чем мы не можем использовать предложение IN? Maddy
4

ьзовать

column is null and column = 1

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

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

@ypercube Вы правы :-) Это моя вина.
РезультатFalse на самом деле, в этом случае (из-за1 в списке).
8

Правильно (но учтите, что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 (оставлено как упражнение) и никакие строки не будут возвращены.

+1, для1 <> NULL => UNKNOWN
@ypercube Большое спасибо Maddy

Похожие вопросы