编写谓词时,如果其中包括一个选择最小值(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。