Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите понять как работает запрос "in (..null..)" / 14 сообщений из 14, страница 1 из 1
06.02.2013, 15:33
    #38140191
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
есть такой запрос для примера:
Код: sql
1.
2.
3.
4.
5.
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 в условие
Код: sql
1.
2.
3.
4.
5.
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 в подзапросе, может кто-то может объяснить двумя словами?
...
Рейтинг: 0 / 0
06.02.2013, 15:45
    #38140216
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
QEOS
Код: sql
1.
ls.ls in (select 1 union select 5 union select null)


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


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

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


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


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

Null Values
...
Рейтинг: 0 / 0
06.02.2013, 15:46
    #38140217
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
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.
...
Рейтинг: 0 / 0
06.02.2013, 15:56
    #38140255
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
Shakillunexpected results
Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.
...
Рейтинг: 0 / 0
06.02.2013, 16:03
    #38140278
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
Гость333Shakillunexpected results
Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.
согласен. скорее всего, имелось в виду, что они не совсем очевидные для тех кто впервые сталкивается
...
Рейтинг: 0 / 0
06.02.2013, 16:09
    #38140292
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
Гость333
Код: sql
1.
ls.ls <> 1 AND ls.ls <> 5 AND ls.ls <> null

Согласно сугубо личному опыту, новички гораздо лучше воспринимают
Код: sql
1.
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)
...
Рейтинг: 0 / 0
07.02.2013, 10:32
    #38141189
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
invmГость333
Код: sql
1.
ls.ls <> 1 AND ls.ls <> 5 AND ls.ls <> null

Согласно сугубо личному опыту, новички гораздо лучше воспринимают
Код: sql
1.
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)



так вот такое описание как раз должно давать отбор..
...
Рейтинг: 0 / 0
07.02.2013, 10:36
    #38141197
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
Почему-то никто не упомянул SET ANSI_NULLS ...
...
Рейтинг: 0 / 0
07.02.2013, 10:48
    #38141222
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
QEOSinvmпропущено...
Согласно сугубо личному опыту, новички гораздо лучше воспринимают
Код: sql
1.
not (ls.ls = 1 or ls.ls = 5 or ls.ls = null)



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

Если ls.ls NOT IN(1,5), то
Код: sql
1.
2.
FALSE OR FALSE OR UNKNOWN = UNKNOWN;
NOT UNKNOWN = UNKNOWN

Таким образом ни разу TRUE не получается!
А WHERE пропускает только TRUE

Сходите по ссылке во втором посте
...
Рейтинг: 0 / 0
07.02.2013, 10:49
    #38141224
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
JovannyПочему-то никто не упомянул SET ANSI_NULLS ...
наверно это не особо важный пункт..

в целом всем спасибо
впринципе понятно как это работает.. это нечто типа правила-исключения. ну что жбудем знать.
...
Рейтинг: 0 / 0
07.02.2013, 10:53
    #38141232
QEOS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
iapQEOSпропущено...


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

Если ls.ls NOT IN(1,5), то
Код: sql
1.
2.
FALSE OR FALSE OR UNKNOWN = UNKNOWN;
NOT UNKNOWN = UNKNOWN

Таким образом ни разу TRUE не получается!
А WHERE пропускает только TRUE

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

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


для 1
Код: sql
1.
not (1 = 1 or 1 = 5 or 1 = null) = false


для 2
Код: sql
1.
not (2 = 1 or 2 = 5 or 2 = null) = true


null в первой таблице нет.
...
Рейтинг: 0 / 0
07.02.2013, 11:14
    #38141286
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
QEOSдля 1
Код: sql
1.
not (1 = 1 or 1 = 5 or 1 = null) = false



для 2
Код: sql
1.
not (2 = 1 or 2 = 5 or 2 = null) = true

Согласно приведенной статье, которую вы не хотите читать или прочли невнимательно:
для 1
Код: sql
1.
not (1 = 1 or 1 = 5 or 1 = null) = not (true or false or unknown) = not (true) = false

для 2
Код: sql
1.
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] http://www.sqlcmd.ru/null_or_not_null-part01.html
...
Рейтинг: 0 / 0
07.02.2013, 11:15
    #38141289
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
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.
...
Рейтинг: 0 / 0
07.02.2013, 11:23
    #38141305
Гость333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите понять как работает запрос "in (..null..)"
QEOSне понял что у вас за математика..
Вы, наверное, привыкли к двухзначной (булевой) логике, оперирующей двумя значениями: Ложь и Истина.
В SQL действует нечёткая трёхзначная логика (Ложь, Истина и Неизвестно).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите понять как работает запрос "in (..null..)" / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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