在写sql的时候经常可能因为NULL的原因造成查询的结果并不是真正想要的。
许多人都知道数据库其实是三值逻辑,即真、假、NULL。
CREATE TABLE BASE_PERSON(
ID INTEGER,
NAME VARCHAR2(30)
);
HUANG>>>>INSERT INTO BASE_PERSON VALUES(1,'huang');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(2,'guagua');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(null,'zheng');
HUANG>>>>commit;
HUANG>>>>select * from base_person;
ID NAME
---------- ------------------------------------------------------------
1 huang
2 guagua
zheng
HUANG>>>>select * from base_person where id=1;
ID NAME
---------- ------------------------------------------------------------
1 huang
HUANG>>>>select * from base_person where id<>1;
ID NAME
---------- ------------------------------------------------------------
2 guagua
HUANG>>>>select * from base_person where id is null;
ID NAME
---------- ------------------------------------------------------------
zheng
这下清楚了吧,呵呵,许多开发人员以为当条件为id<>1时查询结果会有id为2和id为null的数据。
实际上id为null的数据不会查出来,原因是在数据库中任何和null的操作结果都是null不会是真或者假,
即任何和未知的比较结果任然是未知。
在实际的生产中,可能因为sql变得复杂点,null的特殊性容易被忽视,举个例子吧。
(这个例子直接拿了itput上一个人的例子)
update cr_vip_bkg_view_load d
set d.total_cntr_qntt=null,
d.total_cntr_qntt_20=null,
d.total_cntr_qntt_40=null,
d.total_cntr_qntt_40_hq=null,
d.total_cntr_qntt_45_hq=null
where rowid not in
(select max(rowid)
from cr_vip_bkg_view_load d
where (d.cntr_check_digit not like '%*%' or
d.cntr_check_digit is null))
group by d.bkg_num,d.svc_prod_comp_id);
如果这个sql没有d.cntr_check_digit is null这个条件在里面的话,这样的sql很危险,更新的内容会比想要的多。
许多人都知道数据库其实是三值逻辑,即真、假、NULL。
CREATE TABLE BASE_PERSON(
ID INTEGER,
NAME VARCHAR2(30)
);
HUANG>>>>INSERT INTO BASE_PERSON VALUES(1,'huang');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(2,'guagua');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(null,'zheng');
HUANG>>>>commit;
HUANG>>>>select * from base_person;
ID NAME
---------- ------------------------------------------------------------
1 huang
2 guagua
zheng
HUANG>>>>select * from base_person where id=1;
ID NAME
---------- ------------------------------------------------------------
1 huang
HUANG>>>>select * from base_person where id<>1;
ID NAME
---------- ------------------------------------------------------------
2 guagua
HUANG>>>>select * from base_person where id is null;
ID NAME
---------- ------------------------------------------------------------
zheng
这下清楚了吧,呵呵,许多开发人员以为当条件为id<>1时查询结果会有id为2和id为null的数据。
实际上id为null的数据不会查出来,原因是在数据库中任何和null的操作结果都是null不会是真或者假,
即任何和未知的比较结果任然是未知。
在实际的生产中,可能因为sql变得复杂点,null的特殊性容易被忽视,举个例子吧。
(这个例子直接拿了itput上一个人的例子)
update cr_vip_bkg_view_load d
set d.total_cntr_qntt=null,
d.total_cntr_qntt_20=null,
d.total_cntr_qntt_40=null,
d.total_cntr_qntt_40_hq=null,
d.total_cntr_qntt_45_hq=null
where rowid not in
(select max(rowid)
from cr_vip_bkg_view_load d
where (d.cntr_check_digit not like '%*%' or
d.cntr_check_digit is null))
group by d.bkg_num,d.svc_prod_comp_id);
如果这个sql没有d.cntr_check_digit is null这个条件在里面的话,这样的sql很危险,更新的内容会比想要的多。