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.

→ Ссылка