powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / nulls в выражениях типа IN и NOT IN (...)
23 сообщений из 23, страница 1 из 1
nulls в выражениях типа IN и NOT IN (...)
    #32167385
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в таком случае есть результаты

Код: plaintext
1.
2.
3.
4.
SQL> select * from dual where  5  in ( 5 , null);

D
-
X


а в таком нет

Код: plaintext
1.
2.
SQL> select * from dual where  5  not in ( 6 , null);

no rows selected


PS
Скачала и погоняла пару тестов. Первое впечатление - изучение Оракл и подготовка к экзаменам два разных множества которые, пересекаются по очень небольшой области:-)

Например из вариантов

... where inv_dt > to_date('23-jul-1997');
... where inv_dt > '23-jul-1997';
... явно неправильные

надо выбрать правильный. Почему where inv_dt > '23-jul-1997' правилен а where inv_dt > to_date('23-jul-1997') нет, не понятно, толи потому что в нем лишних телодвижений не делается...
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167409
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Первое впечатление - изучение Оракл и подготовка к экзаменам два разных
>множества

это точно, т.к. первое это реальная жизнь, а второе - правильное понимание "политики партии" :-))

что касается твоих примеров, то в первом случае все понятно, т.к. условие в where должно возвращать true или false для набора строк, который будет выбран. В первом случае условию "5 in (5, null)" соответствуют все строки таблицы, т.к. для всех строк таблицы истинно выражение "5=5". А во втором случае ни одной, т.к. это условие всегда ложно.

насчет второго вопроса не совсем понятно, возможно имеется ввиду, что индекс будет использован если функция не применяется.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167410
Vladimir_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С первым вопросом всё ясно там оптимизатор x in ( y, null )
преобразовывает запрос к виду x = y оr ... и условие срабатывает, а с датой мне не совсем понятно.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167412
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по условию "5 not in (6, null)" хотелось бы добавить, что его ложность вытекает из того, что null это неопределенное (произвольное) значение, которое может содержать, а может и не содержать 5.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167413
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому-что надо знать эту самую как её булеву арифметику
Твой запрос
Код: plaintext
1.
select * from dual where  5  not in ( 6 , null);


трансформируется в
Код: plaintext
1.
select * from dual where  5   != 6  and  5 !=NULL;


В таком случае становится понятно что условие всегда будет ложно, так как 5!=NULL всегда будет FALSE.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167415
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>select * from dual where 5 !=6 and 5!=NULL;

ну только OR, а не AND .
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167425
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to .dba:

Ну здрасте, приехали.

Условие 5 not in (6, null) означает что значения 5 нет в этом списке вообще, то есть 5 не равняется ни 6 и ни null, что соответсвует
5 !=6 and 5!=NULL.
Код: plaintext
1.
2.
3.
4.
5.
6.
SQLWKS> select * from dual where  5   != 6  and  5 !=NULL
      2 > 
      3 > 
D
-
Выбрано  0  строк.


А если как ты говоришь "ну только OR, а не AND." , то первое условие будет выполняться и этого будет достаточно и запрос вернёт значение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQLWKS> select * from dual where  5   != 6  or  5 !=NULL
      2 > 
      3 > 
D
-
X
Выбрана  1  строка.


.dba откажись от своих слов, а? :)
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167427
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Vladimir

C датой прикол в том что оба варианта работают и синтаксически правильны

... where inv_dt > to_date('23-jul-1997');
... where inv_dt > '23-jul-1997';

но в тесте почему то правильным считается where inv_dt > '23-jul-1997'.

to all

за совет преобразования в наглядную конструкцию спасибо

усл1 and усл2
усл1 or усл2

намного нагляднее

to .dba

по условию "5 not in (6, null)" хотелось бы добавить, что его ложность вытекает из того, что null это неопределенное (произвольное) значение, которое может содержать, а может и не содержать 5.

То есть можно пользоваться таким правилом - если результат проверки условия неопределен из за наличия null то результат всегда false.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167431
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>.dba откажись от своих слов, а? :)

уже отказался :-))
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167443
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>То есть можно пользоваться таким правилом - если результат проверки
>условия неопределен из за наличия null то результат всегда false.

Вообще-то должно быть не false, а unknown. Но Оракл приравнивает это к false:

Код: plaintext
If the conditions evaluating to UNKNOWN were used in a WHERE clause of a SELECT statement, then no rows would be returned for that query. 
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167445
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to .dba:
принято :)
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167471
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dba:

>что касается твоих примеров, то в первом случае все понятно, т.к. условие
>в where должно возвращать true или false для набора строк, который будет
>выбран. В первом случае условию "5 in (5, null)" соответствуют все строки
>таблицы, т.к. для всех строк таблицы истинно выражение "5=5".
>А во втором случае ни одной, т.к. это условие всегда ложно.

I know you perfectly understand NULL logic, but for people who do not your statement could be very misleading. условие 5 = null всегда NULL!!! (not FALSE). Otherwise if 5 = null is FALSE then by all math logic rules NOT ( 5 = null ) should be TRUE. Same way 5 <> null is always NULL (not FALSE). Another words:

IF 5 = NULL
THEN
DBMS_OUTPUT.PUT_LINE('5 is equal to null');
ELSE
DBMS_OUTPUT.PUT_LINE('5 is not equal to null');
END IF;
/

will not output anything since both 5 = NULL and 5 <> NULL never yield to TRUE.

SY.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167492
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>I know you perfectly understand NULL logic, but for people who do not your
>statement could be very misleading. условие 5 = null всегда NULL!!! (not
>FALSE). Otherwise if 5 = null is FALSE then by all math logic rules NOT ( 5 = null )
>should be TRUE. Same way 5 <> null is always NULL (not FALSE)

Так я вроде уже пояснил этот момент цитатой из Oracle SQL Reference.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167501
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SY

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> begin
   2 
   3   IF  5  = NULL
   4   THEN
   5   DBMS_OUTPUT.PUT_LINE('5 is equal to null');
   6   ELSE
   7   DBMS_OUTPUT.PUT_LINE('5 is not equal to null');
   8   END IF;
   9 
  10   end;
  11   /
 5  is not equal to null

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167506
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I do non consider "Вообще-то должно быть не false, а unknown. Но Оракл приравнивает это к false" and explanation. Oracle NEVER "приравнивает это к false", it is NULL - period. It means I can not tell if 5 is or is not equal to 5, therefore I can not evaluate the condition. And it is not just semantics. It is important to understand when you deal with IF THEN ELSE logic, as it is shown in my example. If Oracle would "приравнивает это к false", ELSE portion of IF would be excuted.

SY.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167518
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SY

Я согласен, что не приравнивает, но в принципе о рез-те такого выражения в контексте возврата строк можно думать как о выражении вернувшем false. Т.е. результат будет такой же как для условия "where 1=0".
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167534
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
My sincere apologies to dba and whole community. I learned someting new today. For years I was under impression ELSE is executed only if confition yields to FALSE and yes it is stated in docs (as I just found out) ELSE is executed if confition yields to FALSE or NULL.
My apologies again.

SY.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167545
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SY

Here, the woman logic applies:-)

THEN block is executed if the condition is YES. ELSE block is executed in all other cases, that is, if the condtion is

NO
MAYBE
MAYBE NOT
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167590
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>My apologies again.

Don't mind. One of the main advantages of this forum, for me, is the possibility to look on my own statements aside. It helps for better understanding own knowledges and to correct my own misleading points.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167601
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
IF  5  = NULL 
THEN 
DBMS_OUTPUT.PUT_LINE('5 is equal to null'); 
ELSE 
DBMS_OUTPUT.PUT_LINE('5 is not equal to null'); 
END IF; 


Ошибочность этого кода, в том что этот код считает, что сравнение числа 5 с NULL значением с использованим знаков =, <>, != итд является правильным.
Но как известно для сравнения с NULL может использоваться ТОЛЬКО!- "IS NULL", "IS NOT NULL". Это надо понять раз и навсегда!!!

В данном случае всегда отвергается первая проверка и поэтому будет истинной вторая. Поверить же это очень просто, достаточно лишь поменять текст сообщений местами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQLWKS> begin 
      2 > IF  5  = NULL 
      3 > THEN 
      4 >  DBMS_OUTPUT.PUT_LINE('5 is equal to null'); 
      5 > ELSE 
      6 > DBMS_OUTPUT.PUT_LINE('5 is not equal to null'); 
      7 > END IF; 
      8 > end;
      9 > 
Предложение обработано.
 5  is not equal to null
SQLWKS> begin 
      2 > IF  5  = NULL 
      3 > THEN 
      4 > DBMS_OUTPUT.PUT_LINE('5 is not equal to null'); 
      5 > ELSE 
      6 >  DBMS_OUTPUT.PUT_LINE('5 is equal to null'); 
      7 > END IF; 
      8 > end;
      9 > 
Предложение обработано.
 5  is equal to null
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167606
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я все думаю и не могу понять, зачем такие люди как

.dba
killed
Al
Angel
Oracle X-pert
и др.

в форум ходят. Сколько здесь сижу ни разу не заметила чтобы они что то новое узнали или что то спрашивали. Но что важно, так это то что такие люди в форуме есть.

Еще очень много полезной и интересной информации можно найти в темах, поднимаемых softbuilder'ом, для тех кто идет по его стопам.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167613
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Violina:

По поводу меня - тут достаточно всё просто: я готовлюсь к сдаче экзаменов, поэтому, то что в 8i появилось новое в сравнении с 8.0.X и я еще не применял на практике по разным причинам - иногда вызывает вопросы.
...
Рейтинг: 0 / 0
nulls в выражениях типа IN и NOT IN (...)
    #32167642
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Violina

Зря Вы думаете, что ничего нового или интересного я для себя не обнаруживаю. Я с интересом читаю о написаниях или оптимизациях запросов. В этом я не силен, хоть и работал какое-то время в разработке и проектировании.

А отвечаю по профессиональной привычке - работал в техподдержке и преподавателем. Коим и сейчас являюсь. Глупости молодости же должен кто-то исправлять...
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / nulls в выражениях типа IN и NOT IN (...)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]