SQL中Case的使用方法以及nvl的使用案例
阿新 • • 發佈:2019-02-17
前言
談談case和nvl的結合使用正文
SQL中Case的使用方法
1.Case具有兩種格式。簡單Case函式和Case搜尋函式。
1)--簡單Case函式 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END 2)--Case搜尋函式 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END 注:nvl(欄位,預設值)
用於判斷欄位是否為空,用於處理空值的。若為空,返回指代的值,否則返回本身欄位的值。案例:
1.需求:
在商戶表(URMTMINF)中根據信用級別CRED_LVL查詢商戶資訊(含有業務程式碼欄位MERC_TRD_CLS)。 再將根據查詢到的業務程式碼,到對應URMTTRADECONF表查詢業務描述(MERC_TRD_DESC)。 (其中URMTTRADECONF表存有一級業務描述MERC_TRD_DESC1其中先根據舊關聯f.MERC_TRD_CLS_OLD=B.MERC_TRD_CLS,如果業務描述為空,在根據新欄位關聯WHERE MERC_TRD_CLS = B.MERC_TRD_CLS,如果仍為空,就賦予常量‘其他’。
如果跟舊欄位關聯時,有可能存在查詢的二級業務描述多的值的情況;此時就就查詢一級業務描述。
-- SELECT B.MERC_ID, B.MERC_CNM, B.MERC_ABBR, (CASE WHEN B.MERC_PROV IS NOT NULL THEN (SELECT FLD_EXP FROM PUBTHLP WHERE FLD_NM = 'PROV_CD' AND FLD_VAL = B.MERC_PROV) ELSE B.MERC_PROV END) AS MERC_PROV_DESC, (CASE WHEN B.MERC_TYP IS NOT NULL THEN (SELECT FLD_EXP FROM PUBTHLP WHERE FLD_NM = 'MERC_TYP' AND FLD_VAL = B.MERC_TYP) ELSE B.MERC_TYP END) AS MERC_TYP_DESC, (CASE WHEN B.CRED_LVL IS NOT NULL THEN (SELECT FLD_EXP FROM PUBTHLP WHERE FLD_NM = 'MERC_LVL' AND FLD_VAL = B.CRED_LVL) ELSE B.CRED_LVL END) AS CRED_LVL_DESC, (CASE WHEN B.MERC_TRD_CLS IS NOT NULL THEN NVL(NVL((CASE WHEN (SELECT COUNT(MERC_TRD_DESC) FROM payadm.URMTTRADECONF WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS)>1 THEN (SELECT DISTINCT MERC_TRD_DESC1 FROM payadm.URMTTRADECONF WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS) ELSE (SELECT MERC_TRD_DESC FROM payadm.URMTTRADECONF WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS) END), (SELECT MERC_TRD_DESC FROM payadm.URMTTRADECONF WHERE MERC_TRD_CLS = B.MERC_TRD_CLS)), '其他') ELSE '其他' END) AS MERC_TRD_DESC FROM URMTMINF B WHERE CRED_LVL = ?
案例二表結構C如下
註冊渠道 實名標誌www 01
A 02
B 01
C 02
D 01
E 01
F 01
要查詢出如下結果:
註冊渠道 非實名使用者數 實名使用者數1 3 1
2 1 2
sql:
select 註冊渠道,A.實名使用者數,B.非實名使用者數
from (select 註冊渠道 L,count(*) 實名使用者數 from 使用者表 where 實名標誌='01' group by 註冊渠道 )A left join
(select 註冊渠道 L,count(*) 非實名使用者數 from 使用者表 where 實名標誌='02' group by 註冊渠道 )B on A.註冊渠道 =B.註冊渠道 ;
表結構C如下