购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

24.确保涉及Min和Max的子查询谓词要处理可能返回Null的情况

编写谓词时,如果其中包括一个选择最小值(Min)或最大值(Max)的子查询,要注意子查询返回的值可能为null。例如:


SELECT E.EMPNO, E.LASTNAME

FROM EMP E

WHERE E.HIREDATE<=

(SELECT MAX(T2.HIREDATE)

FROM TABLE2 T2

WHERE……

AND……)


由于返回值可能为null,这会增加一些处理开销。

开发人员应该养成习惯在用到Min、Max、Sum和Avg函数的查询上加上一个COALESCE、VALUE或IFNULL函数。如果没有发现满足条件的数据行可以用来计算这个函数,DB2会返回null作为结果。

不过,使用Count函数时,如果没有满足条件的行来计算统计结果,DB2会返回0。

要让这个谓词更为高效,可以重写为在子查询中应用VALUE、COALESCE或IFNULL。需要说明的是,目前IFNULL函数只是一个z/OS函数。这3个函数完成的工作都是一样的,也就是说,它们会把可能的null值替换为一个预定义的默认值。要确保已经定义了一个默认值。在这个例子中,指定了‘0001-01-01’来确保如果没有找到一个最大值则不返回任何数据行。例如:


SELECT E.EMPNO, E.LASTNAME

FROM EMP E

WHERE E.HIREDATE<=

(SELECT COALESCE(MAX(T2.HIREDATE),'0001-01-01')

FROM TABLE2 T2

WHERE……

AND……)


通过应用COALESCE函数,DB2可以保证不会从子查询返回一个Null。它可能返回一个具体的HIREDATE值,也可能返回0001-01-01。 a2zAez+CNFhhxeTr0EqzsFpbgjAUPtlC/9L1WjHFtMVWQpOOQ+6eg/SGur2SGZ9+

点击中间区域
呼出菜单
上一章
目录
下一章
×