空值null出现的原因
Oracle数据库查询出现空值null的情况一般由以下两种情况:
1,数据表设计不完善,比如没有外键约束、没有指定默认值、没有指定不能为空等原因。
2,使用left join、right join 或者 full join查询,未关联上的数据字段会用null值填充。
空值null的危害
1,破坏数据的完整性、可读性。
2,影响sql语句的优美和性能。
3,对索引性能的影响。
4,特别是影响数字计算。
空值null的处理
最好的处理方式当然是在数据库设计和业务数据处理逻辑上一劳永逸的解决问题,但是现实中这个是很难做到的,这里简单的列举几个处理null值得函数。
nvl函数
语法格式:nvl(表达式,默认值)
最常用的空值处理函数,nvl首先判断表达式是否为空,如果为空值null则用默认值替代,不为空返回表达式原值。
如select nvl(null,'123') from dual
查询的结果为’123’,语句的意思是用字符串’123’代替null值。
decode函数
语法格式:decode(表达式,条件1,结果1,···条件n,结果n,默认值)
表达式满足条件1返回结果1,···满足条件n返回结果n,如果都不满足则返回默认值。
注意:如果没有指定默认值,则返回控制null。
如:select decode(sign(x-y),0,'零',1,'正','负') from dual
判断x-y的符号,如果为0返回‘‘零’’,如果为1返回‘正’,其他情况返回‘负’(包含x,y至少有一个为空值null的情况)。
coalesce函数
语法格式:coalesce(表达式1,····表达式n,默认值)
依次判断表达式1,···表达式n,返回第一个非空值null的表达式,如果表达式1,···表达式n均为空则返回默认值。
常用在关联查询按优先级取字段值时。
如:
Select coalesce(a.orderid, b.name, c.name, d.name, '未获取')
From so a
Left Join members_hot b
On a.memberid = b.id
Left Join members c
On a.memberid = c.id
Left Join members_cold id
On a.memberid = d.id
Where create_time >= trunc(Sysdate, 'year')
用订单表依次关联会员表获取会员名称,优先级为members_hot ,members,members_cold,如果都没有匹配上则返回‘未获取’。