悟空

本帖最后由 甲骨论-晨曦 于 2012-7-14 22:13 编辑

最近要写一段程序,大约的意思是,找到A列不等于B列的数据。用B列更新A列。
也就是A和B是对应的。 这个表也可能出现用C列更新D列。
为了减少REDO,需要将相同的值过滤掉,不做更新。这里涉及到空值的操作。
特此记录下。


drop table T7 cascade constraints;
create table T7
(
  RN NUMBER,
  C1 NUMBER,
  C2 NUMBER,
  C3 NUMBER,
  C4 NUMBER
);
alter table T7 disable all triggers;

insert into T7 (RN, C1, C2, C3, C4)
values (1, 1, null, null, null);
insert into T7 (RN, C1, C2, C3, C4)
values (2, null, 22, null, null);
insert into T7 (RN, C1, C2, C3, C4)
values (3, null, null, 33, null);
insert into T7 (RN, C1, C2, C3, C4)
values (4, null, null, null, 44);
insert into T7 (RN, C1, C2, C3, C4)
values (5, 51, 52, 53, 54);
insert into T7 (RN, C1, C2, C3, C4)
values (0, null, null, null, null);
insert into T7 (RN, C1, C2, C3, C4)
values (6, 61, 61, null, null);
insert into T7 (RN, C1, C2, C3, C4)
values (7, 71, 72, null, null);
insert into T7 (RN, C1, C2, C3, C4)
values (8, null, null, 83, 83);
insert into T7 (RN, C1, C2, C3, C4)
values (9, null, null, 93, 94);
insert into T7 (RN, C1, C2, C3, C4)
values (10, 101, 101, 103, 103);
insert into T7 (RN, C1, C2, C3, C4)
values (11, 112, 112, 113, 114);
commit;


数据如下

SQL> select *  from t7 order by rn ;

        RN         C1         C2         C3         C4
---------- ---------- ---------- ---------- ----------
         0
         1          1
         2                    22
         3                               33
         4                                          44
         5         51         52         53         54
         6         61         61
         7         71         72
         8                               83         83
         9                               93         94
        10        101        101        103        103

        RN         C1         C2         C3         C4
---------- ---------- ---------- ---------- ----------
        11        112        112        113        114


SQL> select * from t7 where c1 != 1 ;

        RN         C1         C2         C3         C4
---------- ---------- ---------- ---------- ----------
         5         51         52         53         54
         6         61         61
         7         71         72
        10        101        101        103        103
        11        112        112        113        114

SQL> select * from t7 where c1 =1 ;

        RN         C1         C2         C3         C4
---------- ---------- ---------- ---------- ----------
         1          1

看部分数据没有返回。

也就是说 数据库对于值的判断有三种 (使用is 除外)
1 等于     相等返回true
2 不等于  不等返回true
3 空         无论做什么比较都返回false

那么对于为空的列我们做“不等”比较呢?
“不等”的意思是空不等于非空。

SQL> select *
  2  from t7
  3  where c1 !=c2
  4  or (c1 is null and c2 is not null )
  5  or (c1 is not null and c2 is null ) ;

        RN         C1         C2         C3         C4
---------- ---------- ---------- ---------- ----------
         1          1
         2                    22
         5         51         52         53         54
         7         71         72

本次返回了RN为1 和2 的数据。

再次总结下

数据库对于值的判断有三种
1 等于     相等返回true
2 不等于  不等返回true
3 空         无论做什么比较都返回false (使用is 除外)


附送空字歌
本来空,看不空,看不空,也是空;

求得来,还是空,放不下,仍是空;

妄杂念,更是空,到不如,就悟空;

万事空,我先空,悟了空,空不空


标签: 暂无标签
oraask2

写了 49 篇文章,拥有财富 561,被 72 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2012-7-15 16:56:40
经典!!!
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈