在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;