【问题标题】:Unexpected empty query results意外的空查询结果
【发布时间】:2009-10-27 15:32:08
【问题描述】:

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

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

&lt;col1&gt; 是 varchar2(5byte) 没有默认值 &lt;col2&gt; 是数字默认值 -1

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

如果我这样做:

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

我得到 127531 条记录返回

如果我这样做:

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

我得到 86342 条记录返回

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

【问题讨论】:

  • 对 Oracle 的主要抱怨之一是它对 null 和空字符串的处理方式相同。所以,是的,它确实以一种奇怪的方式对待 null,但我认为它不会对您的结果集产生影响

标签: sql oracle


【解决方案1】:

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

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

【讨论】:

  • 这就是我盲目遵循老板指令的结果。 . . .
【解决方案2】:

您的选择在我看来是正确的,如果您没有得到结果,那是数据问题,而不是 Oracle/选择问题。

但是你确定 col1 中的数据在没有 value 时是 null 吗?它也可能只是一个空值 ( '' ) 而不是“null”值,具体取决于写入数据的进程。

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

Select * from &lt;table&gt; where ( &lt;col1&gt; is null or &lt;col1&gt; = '' ) and &lt;col2&gt; = 1;

【讨论】:

    【解决方案3】:

    我认为你的问题是没有行同时 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
    

    编辑:更正的内容和代码

    【讨论】:

      【解决方案4】:

      您的每个过滤器都有两个计数,但没有说明有多少记录符合两个条件。如果您想检查是否可以运行以下查询:

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

      我的钱在返还 0。

      【讨论】:

        【解决方案5】:

        如果我这样做:选择 * from where 一片空白;然后我得到 127531 返回的记录 Select * from 其中= 1;然后我得到 86342 返回的记录

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

        中纠正了它

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-06
          • 2019-05-04
          • 1970-01-01
          • 2023-03-05
          • 2010-11-25
          • 2014-04-08
          • 2020-09-17
          相关资源
          最近更新 更多