意外的空查询结果

时间:2009-10-27 15:32:09

标签: sql oracle

好的,这是一个愚蠢的。 。 。

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的一个人。

5 个答案:

答案 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

中予以纠正 祝你好运!