Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите понять как работает запрос "in (..null..)"  [new]
QEOS
Member

Откуда: мск
Сообщений: 569
есть такой запрос для примера:
select *
from (select 1 as ls union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8) as ls
where ls.ls in (
	select 1 union select 5 union select null
)

Результат: выборка с двумя строками
1
5


если мы ставим not в условие
select *
from (select 1 as ls union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8) as ls
where not ls.ls in (
	select 1 union select 5 union select null
)

то результат пустой

вот не понятна немного как работает mssql с этим встречающимся null в подзапросе, может кто-то может объяснить двумя словами?
6 фев 13, 15:33    [13885311]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Гость333
Member

Откуда:
Сообщений: 3683
QEOS
ls.ls in (select 1 union select 5 union select null)

Это эквивалентно такой проверке:
ls.ls = 1 OR ls.ls = 5 OR ls.ls = null

Такая проверка для значений 1 и 5 возвращает TRUE.

QEOS
если мы ставим not в условие
not ls.ls in (select 1 union select 5 union select null)

А это эквивалентно такой проверке:
ls.ls <> 1 AND ls.ls <> 5 AND ls.ls <> null

Поскольку результат "ls.ls <> null" равен UNKNOWN, то проверка никогда не вернёт TRUE.

Null Values
6 фев 13, 15:45    [13885444]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
QEOS,

http://msdn.microsoft.com/en-us/library/ms177682.aspx
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.
6 фев 13, 15:46    [13885447]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Shakill
unexpected results

Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.
6 фев 13, 15:56    [13885558]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Гость333
Shakill
unexpected results

Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.

согласен. скорее всего, имелось в виду, что они не совсем очевидные для тех кто впервые сталкивается
6 фев 13, 16:03    [13885633]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Гость333
ls.ls <> 1 AND ls.ls <> 5 AND ls.ls <> null
Согласно сугубо личному опыту, новички гораздо лучше воспринимают
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)
6 фев 13, 16:09    [13885666]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
QEOS
Member

Откуда: мск
Сообщений: 569
invm
Гость333
ls.ls <> 1 AND ls.ls <> 5 AND ls.ls <> null
Согласно сугубо личному опыту, новички гораздо лучше воспринимают
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)


так вот такое описание как раз должно давать отбор..
7 фев 13, 10:32    [13888864]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Почему-то никто не упомянул SET ANSI_NULLS ...
7 фев 13, 10:36    [13888887]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
QEOS
invm
пропущено...
Согласно сугубо личному опыту, новички гораздо лучше воспринимают
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)


так вот такое описание как раз должно давать отбор..
Это почему же?
Если ls.ls IN(1,5), то
TRUE OR UNKNOWN = TRUE;
NOT TRUE = FALSE
Если ls.ls NOT IN(1,5), то
FALSE OR FALSE OR UNKNOWN = UNKNOWN;
NOT UNKNOWN = UNKNOWN
Таким образом ни разу TRUE не получается!
А WHERE пропускает только TRUE

Сходите по ссылке во втором посте
7 фев 13, 10:48    [13888978]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
QEOS
Member

Откуда: мск
Сообщений: 569
Jovanny
Почему-то никто не упомянул SET ANSI_NULLS ...

наверно это не особо важный пункт..

в целом всем спасибо
впринципе понятно как это работает.. это нечто типа правила-исключения. ну что жбудем знать.
7 фев 13, 10:49    [13888986]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
QEOS
Member

Откуда: мск
Сообщений: 569
iap
QEOS
пропущено...


так вот такое описание как раз должно давать отбор..
Это почему же?
Если ls.ls IN(1,5), то
TRUE OR UNKNOWN = TRUE;
NOT TRUE = FALSE
Если ls.ls NOT IN(1,5), то
FALSE OR FALSE OR UNKNOWN = UNKNOWN;
NOT UNKNOWN = UNKNOWN
Таким образом ни разу TRUE не получается!
А WHERE пропускает только TRUE

Сходите по ссылке во втором посте


не понял что у вас за математика.. в приведенном вашем примере:
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)

для 1
not (1 = 1 or 1 = 5 or 1 = null) = false

для 2
not (2 = 1 or 2 = 5 or 2 = null) = true

null в первой таблице нет.
7 фев 13, 10:53    [13889014]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
QEOS
для 1
not (1 = 1 or 1 = 5 or 1 = null) = false


для 2
not (2 = 1 or 2 = 5 or 2 = null) = true
Согласно приведенной статье, которую вы не хотите читать или прочли невнимательно:
для 1
not (1 = 1 or 1 = 5 or 1 = null) = not (true or false or unknown) = not (true) = false
для 2
not (2 = 1 or 2 = 5 or 2 = null) = not (false or false or unknown) = not (unknown) = unknown
Для лучшего понимания вопроса -- http://www.sqlcmd.ru/null_or_not_null-part01.html
7 фев 13, 11:14    [13889180]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Jovanny
Почему-то никто не упомянул SET ANSI_NULLS ...

Ну давайте упомянем:
автор
In a future version of SQL Server, ANSI_NULLS will always be ON and any applications that explicitly set the option to OFF will generate an error. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.
7 фев 13, 11:15    [13889191]     Ответить | Цитировать Сообщить модератору
 Re: помогите понять как работает запрос "in (..null..)"  [new]
Гость333
Member

Откуда:
Сообщений: 3683
QEOS
не понял что у вас за математика..

Вы, наверное, привыкли к двухзначной (булевой) логике, оперирующей двумя значениями: Ложь и Истина.
В SQL действует нечёткая трёхзначная логика (Ложь, Истина и Неизвестно).
7 фев 13, 11:23    [13889253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить