|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Такой код: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
select в первом случае возвращает одну запись (5), а после добавления NULL - ни одной. Почему так? Это где-то описано в стандарте SQL? select @@version Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:14 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima T, not in (null) что должен вернуть? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:19 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima T, открываете официальную справку по IN и видите выделенное предупреждение: Any null values returned by subquery or expression that are compared to test_expression using IN or NOT IN return UNKNOWN. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:20 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Владислав КолосовDima T, not in (null) что должен вернуть? Всё. Я так думал. Вот и спрашиваю что не так я понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:21 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Shakill, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:28 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Почему всё? Он вернет "неизвестно", а такое значение не попадает в результат. В результат попадают только достоверные значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 15:58 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Владислав КолосовПочему всё? Он вернет "неизвестно", а такое значение не попадает в результат. В результат попадают только достоверные значения.Этот пример неинтересен. А вот если кроме одного NULL в списке тысяча значений, которым удовлетворяет NOT IN(), то всё равно результат будет UNKNOWN. Ибо логически неизвестно, может NULL, представляющий понятие "UNKNOWN", "включает в себя" запрещённое значение, а может нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 16:11 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima T, Все дело в особенностях троичной логики. Почему так происходит даже на хабре писали. Вот ссылочка Раздел "Операторы IN и NOT IN" с разложением на бинарное дерево ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 16:11 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
iapВладислав КолосовПочему всё? Он вернет "неизвестно", а такое значение не попадает в результат. В результат попадают только достоверные значения.Этот пример неинтересен. А вот если кроме одного NULL в списке тысяча значений, которым удовлетворяет NOT IN(), то всё равно результат будет UNKNOWN. Ибо логически неизвестно, может NULL, представляющий понятие "UNKNOWN", "включает в себя" запрещённое значение, а может нет. ну это примерно как конкатенировать обычную строку и NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 16:14 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
JeStoneDima T, Все дело в особенностях троичной логики. Почему так происходит даже на хабре писали. Вот ссылочка Раздел "Операторы IN и NOT IN" с разложением на бинарное деревоМожно и Ицика Бен-Гана почитать. Он то же самое очень доходчиво рассказал словами ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 16:16 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
iap, да-с проблема бочки мёда и ложки дёгтя :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 16:29 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
все регулируется сетами Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 18:15 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Змейвсе регулируется сетами Код: sql 1.
И вы можете это показать для приведенного в начале скрипта ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 18:16 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
На всякий случай. авторВ будущей версии параметр SQL Server ANSI_NULLS всегда будет иметь значение ON, а приложения, явно присваивающие ему значение OFF, будут вызывать ошибку . Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. SET ANSI_NULLS Не знаю, когда поменяют, но лучше вообще избегать этой конструкции. Она и на планы может влиять и вообще, вносить неразбериху. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 18:21 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Glory, а чего показывать то? Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 19:07 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Змей, Не смотря на то, что по факту вы правы, вы оказываете ТС медвежью услугу, думаю, Glory намекает именно на это. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 20:36 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Проблема легко решается без всяких SEТ`ов Код: sql 1.
Просто надо быть в курсе что есть такая багофича и учитывать. Теперь я в курсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 11:32 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima TПросто надо быть в курсе что есть такая багофича и учитывать. Это багофича называется троичная логика. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 11:36 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Сия тема дает важный урок - прежде, чем строить предположения и делать заключения, необходимо собрать по вопросу как можно больше информации. not exists(), кстати, гарантирует результат без знания о NULLABLE сравниваемого значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 11:45 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima TПроблема легко решается без всяких SEТ`ов Код: sql 1.
Просто надо быть в курсе что есть такая багофича и учитывать. Теперь я в курсе.Владислав прав: надо всегда использовать NOT EXISTS вместо NOT IN. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 11:59 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
JeStoneDima T, Все дело в особенностях троичной логики. Почему так происходит даже на хабре писали. Вот ссылочка Раздел "Операторы IN и NOT IN" с разложением на бинарное дерево Почитал, ясности не добавило. Там просто констатация факта: "IN выберет совпавшие кроме NULL, NOT IN ничего не выберет" Про троичную в курсе, но нестыковка получается: для выборки с IN, например 1 in (1, NULL) , два результата сравнения: есть и неизвестно - включаем 1 в результат. для выборки с NOT IN, например 2 not in (1, NULL) , два результата сравнения: нет и неизвестно - не включаем 2 в результат. Чем "есть" отличается "нет"? ИМХУ данное поведение просто кем-то надумано и заявлено как аксиома. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 12:10 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima TЧем "есть" отличается "нет"? bol - IN Any null values returned by subquery or expression that are compared to test_expression using IN or NOT IN return UNKNOWN. Using null values in together with IN or NOT IN can produce unexpected results ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 12:16 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima TПро троичную в курсе, но нестыковка получается: для выборки с IN, например 1 in (1, NULL) , два результата сравнения: есть и неизвестно - включаем 1 в результат. для выборки с NOT IN, например 2 not in (1, NULL) , два результата сравнения: нет и неизвестно - не включаем 2 в результат. Чем "есть" отличается "нет"? в случае с IN мы точно знаем, что одно из сравнений истинно. этого уже достаточно, чтобы сказать, что условие истинно. true OR unknown = true. в случае с NOT IN мы точно знаем, что один из результатов - нет, а вот при сравнении с NULL результат получается "неизвестно". поэтому, никаких оснований считать результат истинным нет. false AND unknown = unknown. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 12:16 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima TИМХУ данное поведение просто кем-то надумано и заявлено как аксиома. Потому что вы опять из троичной логики пытатесь сделать двоичную 2 not in NULL - это не "истина" и не "ложь". Это "неизвестно" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 12:19 |
|
where not in (...) и NULL. Почему так?
|
|||
---|---|---|---|
#18+
Dima T, на данном форуме, кстати, есть множество тем по этому поводу. Вот, например, вспоминаю те, в которых сам участвовал: Не работает ... where in (select a .... Неожиданное поведение NOT IN с пустыми значениеми (NULL) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2014, 12:25 |
|
|
start [/forum/topic.php?fid=46&msg=38825001&tid=1699740]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 164ms |
0 / 0 |