|
|
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
Почитал /topic/33169 и в очередной раз понял, что две вещи в Оракуле мне не понять:\r почему пустая строка считается NULL (вплоть до того, что NVL(cl_name,\'\') тоже является NULL со всеми вытекающими оттуда последствиями)\r и как пропагандируется результат нечаянного сравнения с NULL в логических выражениях -- то есть, чему будет равен результат (cl_name = \'aaa\' OR cl_name IS NULL). По логике честной пропаганды , если cl_name IS NULL, то левая часть будет UNKNOWN, правая -- TRUE, и результат тоже вроде бы должен быть UNKNOWN. Но ведь работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 01:13:15 |
|
||
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
>почему пустая строка считается NULL (вплоть до того, что NVL(cl_name,'') >тоже является NULL со всеми вытекающими оттуда последствиями) This is one of Oracle's biggest problems. Oracle has no means to differentiate between NULL and empty string. In every Oracle release you will find a note "Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls". >как пропагандируется результат нечаянного сравнения с NULL в логических >выражениях -- то есть, чему будет равен результат (cl_name = 'aaa' OR >cl_name IS NULL). По логике честной пропаганды, если cl_name IS NULL, то >левая часть будет UNKNOWN, правая -- TRUE, и результат тоже вроде бы >должен быть UNKNOWN. Но ведь работает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. As you can see UNKNOWN AND TRUE = TRUE. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 01:48:38 |
|
||
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
а не UNKNOWN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 12:11:34 |
|
||
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
2 Ося SY опечатался - он хотел сказать, что TRUE OR UNK = TRUE Конечно, AND даст UNK. Но в исходном вопросе ветки стоит OR, так что cl_name = 'aaa' OR cl_name IS NULL => TRUE при cl_name is NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 13:07:55 |
|
||
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
2 SY: Thanx Этот ответ тоже бы в FAQ, а то всегда утверждается, что результат сравнения с NULL тоже будет NULL. А оказывается, есть два исключения: FALSE AND NULL => FALSE и TRUE OR NULL => TRUE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 23:13:44 |
|
||
|
NULL, IN and boolean expressions
|
|||
|---|---|---|---|
|
#18+
>Этот ответ тоже бы в FAQ, а то всегда утверждается, что результат сравнения с NULL тоже будет NULL. >А оказывается, есть два исключения: FALSE AND NULL => FALSE и TRUE OR NULL => TRUE I think you are confusing comparison operation with logical operation. Expression cl_name = 'aaa' OR cl_name IS NULL has two comparison operations and a logical operatyion between comparisson results. Comparing with NULL always results in NULL unless you are using IS [NOT] NULL. Logical operation OR is always TRUE if one of the operands is TRUE since all you care is at least one of the operands is TRUE. Therefore it does not matter if other operand is FALSE, NULL or TRUE. Same way AND results in FALSE if one of the operands is FALSE since AND assumes all operands to be TRUE. Therefore it does not matter if other operand is FALSE, NULL or TRUE. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2003, 23:31:43 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32168391&tid=1990350]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 456ms |

| 0 / 0 |
