powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / where not in (...) и NULL. Почему так?
9 сообщений из 34, страница 2 из 2
where not in (...) и NULL. Почему так?
    #38826074
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dawв случае с NOT IN мы точно знаем, что один из результатов - нет, а вот при сравнении с NULL результат получается "неизвестно". поэтому, никаких оснований считать результат истинным нет. false AND unknown = unknown.
Неверно, если тут не врут
Код: sql
1.
exec test_bool( null and false );  -- FALSE


т.е. должно выбраться

Я к тому что троичная логика тут ни при чем.
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826087
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: sql
1.
exec test_bool( null and false );  -- FALSE



т.е. должно выбраться
А c чего вы IN() считаете последовательностью AND-ов ?
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826110
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ к тому что троичная логика тут ни при чем.Ну да, совсем не при чем...
in раскрывается как последовательность or.

2 in (1, 2, null) -> 1 = 2 or 2 = 2 or null = 2 -> false or true or unknown -> true or unknown -> true
3 not in (1, 2, null) -> not (1 = 3 or 2 = 3 or null = 3) -> not (false or false or unknown) -> not(false or unknown) -> not(unknown) -> unknown
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826115
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПро троичную в курсе, но нестыковка получается:
для выборки с IN, например 1 in (1, NULL) , два результата сравнения: есть и неизвестно - включаем 1 в результат.
для выборки с NOT IN, например 2 not in (1, NULL) , два результата сравнения: нет и неизвестно - не включаем 2 в результат.
Чем "есть" отличается "нет"?

ИМХУ данное поведение просто кем-то надумано и заявлено как аксиома.
нет, вы просто ошиблись в раскрытии IN и NOT IN

1 IN (1, NULL) = 1 IN (1) OR 1 IN (NULL) = TRUE OR UNKNOWN = TRUE
2 NOT IN (1, NULL) = (2 NOT IN (1)) AND (2 NOT IN (NULL)) = TRUE AND UNKNOWN = UNKNOWN
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826132
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tdawв случае с NOT IN мы точно знаем, что один из результатов - нет, а вот при сравнении с NULL результат получается "неизвестно". поэтому, никаких оснований считать результат истинным нет. false AND unknown = unknown.
Неверно, если тут не врут
Код: sql
1.
exec test_bool( null and false );  -- FALSE


т.е. должно выбраться

Я к тому что троичная логика тут ни при чем.

я оговорился. там будет true AND unknown = unknown.
но даже и в случае с false - почему выбраться-то должно? выберется тогда и только тогда, когда общий результат выражения = true.
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826134
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только беда в том что оператору where троичная логика никчему - он ее к двоичной округляет, тут-то данные и теряются
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826139
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakтолько беда в том что оператору where троичная логика никчему - он ее к двоичной округляет, тут-то данные и теряютсяэто не округление и не только where, это нормальное поведение любой условной конструкции - срабатывание при общем результате выражения, равном TRUE
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826142
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillIvan Durakтолько беда в том что оператору where троичная логика никчему - он ее к двоичной округляет, тут-то данные и теряютсяэто не округление и не только where, это нормальное поведение любой условной конструкции - срабатывание при общем результате выражения, равном TRUE
про нормальное лучше не будет.
А то так и до споров о том что есть строка нулевой длинны докатимся
...
Рейтинг: 0 / 0
where not in (...) и NULL. Почему так?
    #38826191
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillIvan Durakтолько беда в том что оператору where троичная логика никчему - он ее к двоичной округляет, тут-то данные и теряютсяэто не округление и не только where, это нормальное поведение любой условной конструкции - срабатывание при общем результате выражения, равном TRUEНе совсем так.
Если WHERE пропускает только TRUE,
то CHECK CONSTRAINT не пропускает только FALSE
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / where not in (...) и NULL. Почему так?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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