Коварство NOT IN в SQL (следите за NULL!)

Некоторые вещи в SQL совсем не интуитивны. Я уже писал про пагубность сравнения с NULL в SQL, но недавно снова наступил на эти грабли. Иногда в сложных запросах не всегда очевидна природа данных. Скажем, есть у вас некая таблица customers:

id key
1 25
2 26
3 NULL

Вы привыкли и ожидаете видеть, что key присутствует в таблице всегда, хотя NULL и допустим в архитектуре таблицы, но опыт и интуиция вам подсказывают неверное допущение (не доверяйте интуиции!). И вот вы пишете такого рода запрос:

То есть фактически вы хотите видеть все записи в some_table, у которых в поле key есть значение, которого нет в таблице customers.

И вот ведь сюрприз! Какие бы данные ни содержала в себе таблица some_table, результат этого запроса всегда будет нулевой — ни одной строки он не вернет. Почему так? Да потому что в customers есть запись с id=3, у которой key — это NULL. А мы помним, что с NULL сравнивать нельзя. В общем, надо подстраховываться на такой случай. Если столбец объявлен, как NULLABLE, то в подзапросах, которые будут использоваться с NOT IN, надо явно указывать

 

 

Поделиться: Share on LinkedIn0Share on VKShare on Facebook0Share on Google+0Tweet about this on Twitter

3 комментария

  1. Ну не знаю, пример спорный, допустить null в ключах и самому от этого пострадать =)

    1. наверное, стоило по-другому назвать это поле в примере, действительно

Оставить комментарий

Ваш e-mail не будет опубликован.

Яндекс.Метрика