在ETL项目中经常会碰到这样的一种情况:
目标表中的某列来源于不同的源数据表A,B,C.如果在A中没有有效的数据则从B中取,如果B中没有则从C中取,如果C中也没有则设置为空值。
遇到这样的情况可能,有时候第一个念头就是case when then else end这样的方式,这种方式也可以解决问题,但是写起来还是比较复杂,容易出错,特别是当别人看你写的SQL的时候会头疼。
那么有没有更好的办法呢?
那就是coalesce函数。
COALESCE函数可以替代CASE语句,而且比CASE要方便得多,COALESCE格式:COALESCE (expression_1, expression_2, ...,expression_n)。
第一个非空的表达式是函数的返回值,如果所有的表达式都是空值,最终将返回一个空值。
下面举个项目中实际例子:
问题描述:目标表某列数据来源于HR.MGR_ENTITYCODE, PS.BRAND_CD, PS.ORG,如果HR.MGR_ENTITYCODE没有为空则从 PS.BRAND_CD, PS.ORG取值,如果都为空则返回空值。
SQL如下:
SELECT CI.RESOURCE_ID, COALESCE(HR.MGR_ENTITYCODE, PS.BRAND_CD, PS.ORG) CAL_BRAND_CD,CI.BRAND_CD FROM TESTENV.CR__ITEMS AS CRI LEFT OUTER JOIN TESTENV.PR_ITEMS AS PRI ON CI.PO_KEY = PRI.PO_KEY LEFT OUTER JOIN TESTENV.PURCHASE_SUMMARY AS PS ON PRI.PO_KEY = PS.PO_KEY AND PRI.PO_ITEM_NUM = PS.PO_M_NUM LEFT OUTER JOIN TESTENV.HR_CLD_CONT AS HR ON CI.RESOURCE_ID = HR.RESOURCE_ID WITH UR;