1. 程式人生 > >SQL中Case的使用方法以及nvl的使用案例

SQL中Case的使用方法以及nvl的使用案例

前言

談談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       注:
1)這兩種方式,可以實現相同的功能。 簡單Case函式的寫法相對比較簡潔,但是和Case搜尋函式相比,功能方面會有些限制,比如寫判斷式。      2)還有一個需要注意的問: Case函式只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。    

nvl(欄位,預設值)  

用於判斷欄位是否為空,用於處理空值的。若為空,返回指代的值,否則返回本身欄位的值。

案例:

1.需求:

在商戶表(URMTMINF)中根據信用級別CRED_LVL查詢商戶資訊(含有業務程式碼欄位MERC_TRD_CLS)。 再將根據查詢到的業務程式碼,到對應URMTTRADECONF表查詢業務描述(MERC_TRD_DESC)。 (其中URMTTRADECONF表存有一級業務描述MERC_TRD_DESC1
和二級業務描述MERC_TRD_DESC

其中先根據舊關聯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如下 

總結

  在複雜的sql中,要認真分析。羅列出所有的情況進行考慮。其次還要考慮效能的問題。尤其是大表查詢是儘量使用到索引。