ANSI_NULL ON
SELECT 'B' FROM T WHERE A = (SELECT NULL);
совпадает с:
SELECT 'B' FROM T WHERE A = NULL;
Который всегда возвращает пустой набор, потому что все, что сравнивается с NULL, возвращает NULL, а не TRUE. Вы можете попробовать это:
SELECT 'B' FROM T WHERE A IS NULL;
Второй запрос в основном такой же и возвращает пустой набор:
SELECT 'C' FROM T WHERE A = ANY (SELECT NULL);
Если A имеет значение, следующее вернет все строки:
SELECT 'D' FROM T WHERE A = A;
Кроме того, если A НЕДЕЙСТВИТЕЛЬНО, он вернет пустой набор.
ANSI_NULL OFF
SELECT 'B' FROM T WHERE A = (SELECT NULL);
совпадает с:
SELECT 'B' FROM T WHERE A = NULL;
Возвращает все строки, где A НЕДЕЙСТВИТЕЛЕН.
Второй запрос в основном такой же и возвращает строки, в которых A IS NULL:
SELECT 'C' FROM T WHERE A = ANY (SELECT NULL);
Следующее всегда будет возвращать все строки, независимо от того, равен ли A NULL:
SELECT 'D' FROM T WHERE A = A;