代码之家  ›  专栏  ›  技术社区  ›  andrewWinn

意外的空查询结果

  •  1
  • andrewWinn  · 技术社区  · 15 年前

    好吧,这是一个愚蠢的。….

    Select * from <table> where <col1> is null and <col2> = 1;
    

    <col1> varchar2(5字节)是否没有默认值 <col2> 数字默认为-1

    为什么我的上述查询不会返回任何记录?我知道查询应该返回一个结果集,但我什么也没得到。

    如果我这样做:

    Select * from <table> where <col1> is null; 
    

    我收到127531条记录

    如果我这样做:

    Select * from <table> where <col2> = 1; 
    

    我收到86342条记录

    Oracle是否以一种奇怪的方式处理空值?我是一个有点像MSSQL的人。

    5 回复  |  直到 7 年前
        1
  •  7
  •   Thorsten    15 年前

    根据您所写的内容,我不相信查询应该返回一个记录。在我看来,您没有满足这两个条件的任何行。

    也许你想 OR 这两个条件(获取满足这两个条件中任何一个的记录)?

        2
  •  2
  •   Billy    15 年前

    我认为您的选择是正确的,如果您没有得到结果,那么这是一个数据问题,而不是Oracle/Select问题。

    但当没有值时,您确定col1中的数据为空吗?它可能只是一个空值(“”),而不是实际的“空”值,这取决于写入数据的进程。

    所以为了安全起见,最好尝试:

    Select * from <table> where ( <col1> is null or <col1> = '' ) and <col2> = 1;

        3
  •  1
  •   EMPraptor    15 年前

    我认为你的问题是,没有行的col1为空,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查询不会返回任何内容是正确的。

    我不知道你对空值的奇怪处理是什么意思。我认为Oracle唯一不同的做法是空字符串为空。在Oracle中比较字符串时,必须记住这一点。我知道你也可以配置MSSQL以这样的方式运行。

    我敢肯定,在默认情况下(没有一些奇怪的自定义配置),当在“布尔”逻辑表达式中使用时,MSSQL和Oracle都以相同的方式处理空值。但当我第一次知道它是如何工作的时候,我觉得很奇怪。

    为空,不为空: 这是你所期望的。根据值是否为空,返回true或false。

    所有其他比较运算符: 如果要比较的一个或两个值都为空,则操作结果为空。(例如:空值<1计算为空,空值=空值计算为空,空值<>1计算为空)

    所有逻辑运算符(not,and,or,…): 如果一个或多个操作数为空,则对该操作进行计算,就像空值可以同时为true和false一样。如果此方法在某些情况下生成“真”而在其他情况下生成“假”,则结果为空。(例如:空和假的计算结果为假,空和真的计算结果为空,非空的计算结果为空)

    在条件/where子句中使用时: 计算结果为空的逻辑表达式与计算结果为假的逻辑表达式具有相同的效果。如果不执行块,并且不返回表达式计算结果为空的行。

    实例:

    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
  •  1
  •   APC    15 年前

    每个筛选器有两个计数,但没有指示匹配的记录数 二者都 标准。如果要检查是否可以运行以下查询:

    select count(*) from 
    (
        Select * from <table> where <col1> is null
        intersect
        Select * from <table> where <col2> = 1)
    /
    

    我的钱花在它身上。

        5
  •  0
  •   Rulas    15 年前

    如果是:选择*从何处 是空的;那么我得到127531 返回的记录选择*来自 式中=1;则我得到86342 返回的记录

    您的sintax似乎是正确的,但是可能没有满足这两个条件的记录,可能您正在尝试使用或,或者您的DBMS正在做奇怪的事情,我在SQL导航器6中遇到了类似的问题,他们已经接受了该问题并在中更正了它。 Version 6.1

    祝你好运!