是个很简单的问题。表里面的数据:
SQL> select * from product_all;       ID1     AMOUNT        ID2     WEIGHT      EXIST
---------- ---------- ---------- ---------- ----------
         2        200          2         22          0
         4        400          4         44          1
         3        300
         1        100查询语句:
SQL> select * from product_all where id2<>2;       ID1     AMOUNT        ID2     WEIGHT      EXIST
---------- ---------- ---------- ---------- ----------
         4        400          4         44          1按照人的通常思维,值为空,当然也是不等于2的,所以本来想能将后面两条记录查出来,但实际查不出来。这个原因其实我是明白的。
因为oracle里面null值是不能用比较运算符的,任何比较得到的结果都是false,所以后面两条id2字段为null的记录查不出来。
要想查出来这些记录,必须加一个条件or id2 is null但是我的问题是,oracle的这种特性会给应用带来困惑:
第一,这要求做应用的人必须知道字段的准确属性,是否可能为null,并且时刻牢记
第二,还要求做应用的人必须时刻牢记oracle null值比较的特性
但是这其实与人普通思维有悖,应用的人很容易忘记加or id2 is null的条件。大家都是怎么做的,难道所有非等值比较都去加一个is null么?这太累赘了。

解决方案 »

  1.   

    转换了对比
    select * 
    from product_all 
    where nvl(id2,'0') <> 2
      

  2.   

    is null 是Oracle查询比较中常用的条件字段,貌似没有什么好办法
      

  3.   

    oracle 所以 诞生 了  NVL 函数处理这个  null 的问题。
      

  4.   


    嗯,至少这样看起来比再加一个or条件要简洁一点。
    不过还是要求执行者要记得这样用。我发现我以前写sql都没有注意过这个,也没出现过错误,恐怕是因为那些字段恰好有not null限制或者恰好没有空值记录。否则一定会有问题啊。
    想想都后怕。
      

  5.   

    nvl可以满足,nvl(a,b)是a为null的时候转换为b
      

  6.   

    select * from product_all where nvl(id2,'0') <> 2
      

  7.   

     nvl(id2,'0')和表字段添加非空约束