MySql Неоднозначное поведение NULL в IN условии
Почему этот запрос выводит пользователей:
SELECT * FROM `mytable` WHERE NOT 23 IN (1, 2, 4, 43);
А этот нет:
SELECT * FROM `mytable` WHERE NOT 23 IN (1, 2, 4, 43, NULL);
И как сделать чтобы выводил?
Ответы (1 шт):
Автор решения: Мелкий
→ Ссылка
Таково требование стандарта SQL. Не смогу привести однозначную краткую цитату, но стандарт относит IN к equality operations, аналогично прочим операторам сравнения, а потому к IN так же применяется общая троичная логика. Выражение
foo in (1,2,NULL)
эквивалентно
foo = 1 OR foo = 2 OR foo = NULL
которое для любого foo будет NULL. А, в свою очередь, NULL в выражении where означает "нет совпадения"
Сделать с этим можно что-то разумное только одно - проверяйте подставляемые в условия данные на стороне приложения и не подставляйте NULL.