Я почти уверен, что Postgres верен.
Хотя почти каждое сравнение с NULL
возвращает NULL
, вы нашли исключение. Если набор пуст, то none в наборе. То есть любое значение НЕ находится в наборе независимо от значения.
Помните, семантика NULL
означает «неизвестное» значение - не отсутствуетстоимость. «Неизвестный» означает, что он может принимать любое значение. Выражение <anything> not in (<empty set>)
является истинным, независимо от значения <anything>
.
Кстати, Postgres не одинок в этом поведении. Беглый взгляд показывает, что SQL Server и Oracle также возвращают 1
для эквивалентных запросов.