ANSI_NULL ON
SELECT 'B' FROM T WHERE A = (SELECT NULL);
is the same as:
SELECT 'B' FROM T WHERE A = NULL;
Which always returns an empty set because anything compared to NULL returns NULL, not TRUE. You might try this:
SELECT 'B' FROM T WHERE A IS NULL;
The second query is basically the same and will return an empty set:
SELECT 'C' FROM T WHERE A = ANY (SELECT NULL);
If A has a value, the following will return all rows:
SELECT 'D' FROM T WHERE A = A;
Except, if A IS NULL, it will return an empty set.
ANSI_NULL OFF
SELECT 'B' FROM T WHERE A = (SELECT NULL);
is the same as:
SELECT 'B' FROM T WHERE A = NULL;
Which returns all rows where A IS NULL.
The second query is basically the same and will return rows where A IS NULL:
SELECT 'C' FROM T WHERE A = ANY (SELECT NULL);
The following will always return all rows, regardless if A IS NULL:
SELECT 'D' FROM T WHERE A = A;