我认为你的问题是没有行同时 col1 为 NULL 并且 col2 为 1。做...
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。但是当我第一次了解它的工作原理时,我发现它很奇怪。
为空,不为空:
这些工作如你所料。它们根据值是否为 NULL 返回 TRUE 或 FALSE。
所有其他比较运算符:
如果被比较的一个或两个值为 NULL,则操作的结果为 NULL。 (例如:NULL 1 计算为 NULL)
所有逻辑运算符(非、与、或、...):
如果一个或多个操作数为 NULL,则评估该操作,就好像 NULL 值既可以是 TRUE 也可以是 FALSE。如果此方法在某些情况下产生 TRUE 而在其他情况下产生 FALSE,则结果为 NULL。 (例如:NULL AND FALSE 计算为 FALSE,NULL AND TRUE 计算为 NULL,NOT NULL 计算为 NULL)
在条件/WHERE 子句中使用时:
计算结果为 NULL 的逻辑表达式与计算结果为 FALSE 的逻辑表达式具有相同的效果。不执行 IF 块并且不返回 WHERE 表达式计算结果为 NULL 的行。
示例:
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
编辑:更正的内容和代码