powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите понять как работает запрос "in (..null..)"
14 сообщений из 14, страница 1 из 1
помогите понять как работает запрос "in (..null..)"
    #38140191
Фотография QEOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой запрос для примера:
Код: 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
помогите понять как работает запрос "in (..null..)"
    #38140216
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите понять как работает запрос "in (..null..)"
    #38140217
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите понять как работает запрос "in (..null..)"
    #38140255
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillunexpected results
Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.
...
Рейтинг: 0 / 0
помогите понять как работает запрос "in (..null..)"
    #38140278
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333Shakillunexpected results
Это не очень хорошее объяснение. Если понимать механизм, то results будут полностью expected.
согласен. скорее всего, имелось в виду, что они не совсем очевидные для тех кто впервые сталкивается
...
Рейтинг: 0 / 0
помогите понять как работает запрос "in (..null..)"
    #38140292
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
помогите понять как работает запрос "in (..null..)"
    #38141189
Фотография QEOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите понять как работает запрос "in (..null..)"
    #38141197
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то никто не упомянул SET ANSI_NULLS ...
...
Рейтинг: 0 / 0
помогите понять как работает запрос "in (..null..)"
    #38141222
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите понять как работает запрос "in (..null..)"
    #38141224
Фотография QEOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JovannyПочему-то никто не упомянул SET ANSI_NULLS ...
наверно это не особо важный пункт..

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


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