The following bug has been logged online:
Bug reference: 2961
Logged by: Aaron Logue
Email address: gyro@cryogenius.com
PostgreSQL version: 8.2.1
Operating system: Linux (various flavors)
Description: NULL values in subselects force NOT IN to false
Details:
SELECT X FROM (SELECT 42 AS X) AS FOO WHERE X NOT IN (7,NULL);
returns 0 rows. Shouldn't "X NOT IN (7,NULL)" be
true if X is neither 7 nor NULL? Removing the NULL causes the row to be
returned.
Here's a form of the problem using normal tables:
CREATE TABLE test1 (
test_id numeric(28,0)
);
CREATE TABLE test2 (
test_id numeric(28,0)
);
INSERT INTO test1 (test_id) VALUES (1);
INSERT INTO test2 (test_id) VALUES (2);
INSERT INTO test2 (test_id) VALUES (NULL);
SELECT test_id FROM test1 WHERE test_id NOT IN (SELECT test_id FROM test2);
will return 0 rows. Deleting the null field from test2 or updating
test2.test_id to a non-null value will cause it to behave as expected.