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.