Я думаю, что ваша проблема в том, что нет строк, в которых col1 равно NULL, а col2 равно 1. Do ...
SELECT COUNT(*)
FROM <table>
Есть ли в таблице более 127531 + 86342 записей? Тогда возможно, что ни один ряд не соответствует вашему состоянию. Попробуйте также ...
SELECT COUNT(*)
FROM <table>
WHERE <col1> IS NOT NULL
OR <col2> IS NULL OR <col2> <> 1
Это даст количество строк, которые не влияют на ваше состояние. Это то же самое, что и общее количество записей в таблице? Тогда верно, что ваш оригинальный запрос ничего не возвращает.
Я не знаю, что вы подразумеваете под странной обработкой NULL. Я думаю, что Oracle делает по-другому только то, что пустая строка равна NULL. Когда вы сравниваете строки в Oracle, вы должны помнить об этом. Я знаю, что вы также можете настроить MSSQL так же.
Я почти уверен, что по умолчанию (без какой-то странной пользовательской конфигурации) MSSQL и Oracle оба обрабатывают NULL одинаково при использовании в логическом выражении "Boolean". Но я нашел это странным, когда впервые узнал, как это работает.
NULL, НЕ NULL:
Они работают как вы ожидаете. Они возвращают ИСТИНА или ЛОЖЬ в зависимости от того, является ли значение НЕДЕЙСТВИТЕЛЬНЫМ или нет.
ВСЕ ДРУГИЕ СРАВНИТЕЛЬНЫЕ ОПЕРАТОРЫ:
Если одно или оба сравниваемых значения равны NULL, результат операции равен NULL. (например, NULL <1 оценивается в NULL, NULL = NULL оценивается в NULL, NULL <> 1 оценивается в NULL)
ВСЕ ЛОГИЧЕСКИЕ ОПЕРАТОРЫ (НЕ, И, ИЛИ, ...):
Если один или несколько операндов имеют значение NULL, оцените операцию так, как если бы значения NULL могли быть ИСТИНАМИ и ЛОЖЬМИ. Если этот метод возвращает TRUE в некоторых случаях и FALSE в других, результатом будет NULL. (например, NULL AND FALSE оценивается как FALSE, NULL AND TRUE оценивается как NULL, NOT NULL оценивается как NULL)
КОГДА ИСПОЛЬЗУЕТСЯ В УСЛОВНЫХ УСЛОВИЯХ / ГДЕ:
Логическое выражение, которое оценивается как NULL, имеет тот же эффект, что и выражение, которое оценивается как FALSE. Блоки IF не выполняются и строки, для которых выражение WHERE оценивается как NULL, не возвращаются.
Примеры: * 1 021 *
DECLARE
A NUMBER;
BEGIN
A:=0;
IF NULL = NULL THEN
A:=1;
END IF;
DBMS_OUTPUT.PUT_LINE(A); -- this will print 0.
END;
-- without the WHERE clause, following query
-- would result in a single row of single value "hi"
SELECT 'hi'
FROM dual
WHERE 1 <> NULL OR NULL = NULL; -- this returns no rows
РЕДАКТИРОВАТЬ: исправлено содержание и код