oracle中is null和‘‘的坑

场景

例如type字段有 null、‘’、0、1、2、3 几个值,想要筛选出有数据,但是不为3的数据。
语句:

select * from t_user where type is not null 
and type !='3' and type !='' ;

但是发现查不出数据,这就怪了。

排查解决

是因为oracle同字段不支持2个!=吗

一开始以为oracle同字段不支持2个 != ,那么测试下:

select * from t_user where type !='3' and type !='4' ;

发现有结果,同字段2个!=是没问题的。

null和’’

这里只模拟char和varchar2类型,其他的先不考虑。

试下查询

百度了下,oracle的char和varchar类型中,null和’'是有点区别。
继续测试:

select * from t_user where type !=''; -- 查不出结果
select * from t_user where type is not null ; -- 有结果

select * from t_user where type =''; -- 查不出结果
select * from t_user where type is null ; -- 有结果
试下update

那么update可以吗?语句:

update t_user set type ='' where id  =1;
update t_user set type =null where id  =2;
再查一下:
select * from t_user where type is null;
发现''null的结果都能查出来。

也就是说在oracle中,查询’'和null都要用 is null来查。

回到最初问题

那么开始遇到的问题就很好解决了。
要筛选不为null和不为’'的数据,只要一个 is not null 即可。
语句:

select * from t_user where type is not null 
and type !='3' 
-- and type !=''  -- 这个条件查不出任何内容,必须去掉

问题解决。

总结

注:
当类型为char或varchar2时,过滤条件,不要用 =‘’ 或者 !=‘’,因为什么都查不出来。
mysql没有此限制。

你可能感兴趣的:(oracle,oracle,数据库)