好的,这是一个愚蠢的。 。 。
Select * from <table> where <col1> is null and <col2> = 1;
<col1>
是varchar2(5byte)没有defalut值
<col2>
的数字默认值为-1
为什么我的上述查询不会返回任何记录?我知道查询应该返回一个结果集,但我什么也没得到。
如果我这样做:
Select * from <table> where <col1> is null;
我收到了127531条记录
如果我这样做:
Select * from <table> where <col2> = 1;
我收到了86342条记录
Oracle是否以奇怪的方式处理空值?我是MSSQL的一个人。
答案 0 :(得分:7)
从你写的内容来看,我不相信查询应该返回一条记录。在我看来,你没有任何满足这两个条件的行。
也许您想OR
这两个条件(获取满足两个条件中的任何一个的记录)?
答案 1 :(得分:2)
你的选择对我来说是正确的,如果你没有得到结果那么这是一个数据问题,而不是Oracle / select问题。
但是,如果没有值,你确定col1中的数据为空吗?它可能只是一个空值(''),实际上不是“null”值,具体取决于写入数据的过程。
为了安全起见,最好先尝试一下:
Select * from <table> where ( <col1> is null or <col1> = '' ) and <col2> = 1;
答案 2 :(得分:1)
每个过滤器都有两个计数,但没有迹象表明有多少记录符合两个标准。如果要检查是否可以运行以下查询:
select count(*) from
(
Select * from <table> where <col1> is null
intersect
Select * from <table> where <col2> = 1)
/
我的钱正在上涨0。
答案 3 :(得分:1)
我认为您的问题是没有行,其中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
这将产生不符合您条件的行数。这与表中的记录总数相同吗?那么你的orignal查询不会返回任何内容是正确的。
我不知道你对NULL的奇怪处理是什么意思。我认为Oracle唯一不同的是空字符串IS NULL。在Oracle中比较字符串时,必须牢记这一点。我知道您可以将MSSQL配置为也采用这种方式。
我很确定,默认情况下(没有一些奇怪的自定义配置),MSSQL和Oracle在“布尔”逻辑表达式中使用时都以相同的方式处理NULL。但是当我第一次了解它的工作原理时,我发现它很奇怪。
IS NULL,IS NOT NULL: 这些工作正如您所期望的那样。它们返回TRUE或FALSE,具体取决于值是否为NULL。
所有其他比较运营商: 如果要比较的一个或两个值为NULL,则操作的结果为NULL。 (例如:NULL&lt; 1计算为NULL,NULL = NULL计算为NULL,NULL&lt;&gt; 1计算为NULL)
所有逻辑运算符(NOT,AND,OR,...): 如果一个或多个操作数为NULL,则评估操作,就好像NULL值可以为TRUE和FALSE。如果此方法在某些情况下产生TRUE而在其他情况下产生FALSE,则结果为NULL。 (例如:NULL和FALSE求值为FALSE,NULL和TRUE求值为NULL,NOT NULL求值为NULL)
在条件/适用条款中使用时: 计算结果为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
编辑:更正的内容和代码
答案 4 :(得分:0)
如果我这样做:从中选择* 一片空白;然后我得到了127531 返回的记录选择*来自 where = 1;然后我得到了86342 记录已返回
你的sintax似乎是正确的,但也许没有记录满足这两个条件,也许你正在尝试使用OR,或者你的DBMS可能做了奇怪的事情,我在SQL Navigator 6中遇到过类似的问题,他们已经接受了这个问题,并在Version 6.1
中予以纠正 祝你好运!