首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定Oracle null == null

确定Oracle null == null
EN

Stack Overflow用户
提问于 2008-10-10 14:37:55
回答 11查看 26.9K关注 0票数 46

我希望在可为空的列上搜索数据库表。有时我要搜索的值本身是空的。由于Null等于nothing,甚至等于NULL,因此

代码语言:javascript
复制
where MYCOLUMN=SEARCHVALUE 

都会失败。现在我不得不求助于

代码语言:javascript
复制
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))

有没有更简单的说法呢?

(如果重要的话,我会使用Oracle )

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-10-10 14:42:06

你可以做IsNull或NVL之类的事情,但这只会让引擎做更多的工作。您将调用函数来执行列转换,然后必须对结果进行比较。

利用你所拥有的

代码语言:javascript
复制
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
票数 72
EN

Stack Overflow用户

发布于 2008-10-10 16:12:04

@Andy Lester断言,原始形式的查询比使用NVL更有效。我决定测试一下这个断言:

代码语言:javascript
复制
    SQL> DECLARE
      2    CURSOR B IS
      3       SELECT batch_id, equipment_id
      4         FROM batch;
      5    v_t1  NUMBER;
      6    v_t2  NUMBER;
      7    v_c1  NUMBER;
      8    v_c2  NUMBER;
      9    v_b   INTEGER;
     10  BEGIN
     11  -- Form 1 of the where clause
     12    v_t1 := dbms_utility.get_time;
     13    v_c1 := dbms_utility.get_cpu_time;
     14    FOR R IN B LOOP
     15       SELECT COUNT(*)
     16         INTO v_b
     17         FROM batch
     18        WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL);
     19    END LOOP;
     20    v_t2 := dbms_utility.get_time;
     21    v_c2 := dbms_utility.get_cpu_time;
     22    dbms_output.put_line('For clause: WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL)');
     23    dbms_output.put_line('CPU seconds used: '||(v_c2 - v_c1)/100);
     24    dbms_output.put_line('Elapsed time: '||(v_t2 - v_t1)/100);
     25  
     26  -- Form 2 of the where clause
     27    v_t1 := dbms_utility.get_time;
     28    v_c1 := dbms_utility.get_cpu_time;
     29    FOR R IN B LOOP
     30       SELECT COUNT(*)
     31         INTO v_b
     32         FROM batch
     33        WHERE NVL(equipment_id,'xxxx') = NVL(R.equipment_id,'xxxx');
     34    END LOOP;
     35    v_t2 := dbms_utility.get_time;
     36    v_c2 := dbms_utility.get_cpu_time;
     37    dbms_output.put_line('For clause: WHERE NVL(equipment_id,''xxxx'') = NVL(R.equipment_id,''xxxx'')');
     38    dbms_output.put_line('CPU seconds used: '||(v_c2 - v_c1)/100);
     39    dbms_output.put_line('Elapsed time: '||(v_t2 - v_t1)/100);
     40  END;
     41  /


    For clause: WHERE equipment_id = R.equipment_id OR (equipment_id IS NULL AND R.equipment_id IS NULL)
    CPU seconds used: 84.69
    Elapsed time: 84.8
    For clause: WHERE NVL(equipment_id,'xxxx') = NVL(R.equipment_id,'xxxx')
    CPU seconds used: 124
    Elapsed time: 124.01

    PL/SQL procedure successfully completed

    SQL> select count(*) from batch;

  COUNT(*)
----------
     20903

SQL> 

我有点惊讶地发现安迪是多么的正确。使用NVL解决方案的成本要高出近50%。因此,即使一段代码看起来不像另一段代码那样整洁或优雅,它的效率也会显著提高。我多次运行此过程,每次的结果几乎相同。向安迪致敬。

票数 36
EN

Stack Overflow用户

发布于 2011-03-15 04:17:56

Expert Oracle Database Architecture中,我看到:

代码语言:javascript
复制
WHERE DECODE(MYCOLUMN, SEARCHVALUE, 1) = 1
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/191640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档