Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / nulls в выражениях типа IN и NOT IN (...) / 23 сообщений из 23, страница 1 из 1
23.05.2003, 15:33:52
    #32167385
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
Почему в таком случае есть результаты

Код: 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
23.05.2003, 15:42:32
    #32167409
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>Первое впечатление - изучение Оракл и подготовка к экзаменам два разных
>множества

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

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

насчет второго вопроса не совсем понятно, возможно имеется ввиду, что индекс будет использован если функция не применяется.
...
Рейтинг: 0 / 0
23.05.2003, 15:43:07
    #32167410
Vladimir_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
С первым вопросом всё ясно там оптимизатор x in ( y, null )
преобразовывает запрос к виду x = y оr ... и условие срабатывает, а с датой мне не совсем понятно.
...
Рейтинг: 0 / 0
23.05.2003, 15:45:15
    #32167412
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
по условию "5 not in (6, null)" хотелось бы добавить, что его ложность вытекает из того, что null это неопределенное (произвольное) значение, которое может содержать, а может и не содержать 5.
...
Рейтинг: 0 / 0
23.05.2003, 15:45:33
    #32167413
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
Потому-что надо знать эту самую как её булеву арифметику
Твой запрос
Код: 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
23.05.2003, 15:48:14
    #32167415
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>select * from dual where 5 !=6 and 5!=NULL;

ну только OR, а не AND .
...
Рейтинг: 0 / 0
23.05.2003, 15:56:13
    #32167425
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 15:57:11
    #32167427
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 15:58:36
    #32167431
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>.dba откажись от своих слов, а? :)

уже отказался :-))
...
Рейтинг: 0 / 0
23.05.2003, 16:05:41
    #32167443
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>То есть можно пользоваться таким правилом - если результат проверки
>условия неопределен из за наличия 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
23.05.2003, 16:06:19
    #32167445
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
to .dba:
принято :)
...
Рейтинг: 0 / 0
23.05.2003, 16:20:29
    #32167471
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 16:29:09
    #32167492
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>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
23.05.2003, 16:35:32
    #32167501
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 16:37:32
    #32167506
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 16:42:23
    #32167518
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
2 SY

Я согласен, что не приравнивает, но в принципе о рез-те такого выражения в контексте возврата строк можно думать как о выражении вернувшем false. Т.е. результат будет такой же как для условия "where 1=0".
...
Рейтинг: 0 / 0
23.05.2003, 16:52:19
    #32167534
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 16:58:54
    #32167545
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
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
23.05.2003, 17:26:17
    #32167590
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
>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
23.05.2003, 17:36:46
    #32167601
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
Код: 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
23.05.2003, 17:41:00
    #32167606
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nulls в выражениях типа IN и NOT IN (...)
А я все думаю и не могу понять, зачем такие люди как

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

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

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

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

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

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


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