Postgres NOT IN (null) не дает результата
Я использую Postgres с этим запросом
select
*
from Entity this_
where
(this_.ID not in (null))
Почему это не дает мне никаких результатов? Я ожидал бы получить все строки, где id не равен null
с
(this_.ID not in (1))
i получить ожидаемые результаты
Ответы
Ответ 1
Результат [not] in (null)
всегда будет нулевым. Для сравнения с нулевым значением вам нужно is [not] null
или is [not] distinct from null
select *
from Entity this_
where this_.ID is not null
Если вы хотите where (ID not in (1,null))
, как в своем комментарии, вы можете сделать
where ID is not null and ID not in (1)
Ответ 2
PostgreSQL использует значение NULL как undefined.
То, что вы запрашиваете, - это вернуть элементы, отсутствующие в списке или значении undefined. Поскольку undefined означает, что вы не знаете, что внутри, PostgreSQL не возвращает какой-либо элемент, потому что просто не может ответить на запрос.
Хотя запрос:
select * from Entity where id in (1, null)
может возвращать записи, потому что если он найдет элемент с идентификатором ID = 1, то это будет в коллекции
запрос:
select * from Entity where (ID not in (1, null))
не может быть выполнено, поскольку нулевое значение может быть любым значением.
Ответ 3
select *
from Entity this_
where (this_.ID not in (null))
"IN" или "NOT IN" не выбирают значения NULL. Вы можете написать
select *
from Entity this_
where (this_.ID not in (1))
И ваш выбор не будет содержать нулевые значения
Ответ 4
Вы можете использовать <> ЛЮБОЙ оператор. Пример по вашему коду:
select
*
from Entity this_
where
(this_.ID <> ANY (null))
Ответ 5
У меня было похоже на проблемы и в конечном итоге пришли к следующему решению;
select * from public."Employee_11" where (COALESCE("Name",'@'),"Surname")
in (
('@','dummy')
)
Он возвращает записи, столбец имени которых имеет нулевые значения. Вы также можете использовать это для пункта not in, который вернет ненулевые записи Name;
select * from public."Employee_11" where (COALESCE("Name",'@'),"Surname")
not in (
('@','dummy')
)
Ответ 6
У меня была похожая проблема. Мое эго, что я хорошо знал SQL, получил прокол. Вот упрощенный пример из таблиц Скотта/Тигра.
select empno, ename from emp where deptno not in (10, 20, null);
Ничего не вернул. Хотя я использую условие NOT IN очень экономно, потому что оно не использует индекс и работает очень медленно. Я предпочитаю использовать OUTER JOIN вместо этого.
Я пробовал этот запрос в Postgres и Oracle, и результаты совпадают. Таким образом, должен быть результат, соответствующий стандартам. NULL ведет себя таким образом только в состоянии NOT IN.