复杂查询 - IF ELSE或CASE或两者(复制ETL过程的一部分)

时间:2011-09-20 11:43:23

标签: sql sql-server

不确定如何应用此查询(此查询的目的是复制ETL过程的一部分,从而验证它):

bill_type = C or Mpayer type = C (client) or S (Subsidiary) or T (third party)

付款人类型定义如下:

If BLT_BILLP.PAYR_CLIENT_UNO <> HBM_MATTER.CLIENT_UNO for Lead Matter 
and TBM_MATTER._HS_3PTY = 0 Then value = S ('Subsidiary')

If BLT_BILLP.PAYR_CLIENT_UNO <> HBM_MATTER.CLIENT_UNO for Lead Matter 
and TBM_MATTER._HS_3PTY = 1 Then value = T ('Third Party')

If BLT_BILLP.PAYR_CLIENT_UNO = HBM_MATTER.CLIENT_UNO for Lead Matter 
Then value = C (    'Client')

BLT_BILL._HS_CNTYPE = blank 

然后交易代码= BC或BS或BT。

案例查询最好:

   SELECT CASE BILL_TYPE
          WHEN 'C' THEN 'BC'
          END 
   FROM DBO.SRC_BLT.BILL

以下是我尝试创建查询,是否有更好的方法:

     SELECT CASE BILL_TYPE 
    WHEN  'C' THEN 
                    (CASE      
                        WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN           
                            CASE DBO.SRC_TBM_MATTER._HS_3PTY             
                                WHEN 0 then 'S'             
                                WHEN 1 then 'T'
                            END 
                        WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
                    END)

     WHEN  'M' THEN 
                    (CASE      
                        WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN           
                            CASE DBO.SRC_TBM_MATTER._HS_3PTY             
                                WHEN 0 then 'S'             
                                WHEN 1 then 'T'
                            END 
                        WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
                    END)

     END AS TRANS_CODE              


     FROM DBO.SRC_BLT_BILLP, DBO.SRC_HBM_MATTER, DBO.SRC_TBM_MATTER, DBO.SRC_BLT_BILL

     AND WHERE _HS_CNTYPE = ''

2 个答案:

答案 0 :(得分:1)

我不会说。当我看到“if”或“case”时,我认为是“程序性的”。当它基于集合和声明时,SQL效果最好。

除非这是一个存储过程,否则我会重做这个以消除“if”和“case”。只是我的意见。

如果每个帐单和播放器类型都有不同的数据集,您可以将它们作为视图访问,并从查询中消除此逻辑。

答案 1 :(得分:1)

对CASE条款稍微干一些的方法:

 SELECT CASE 
            WHEN BILL_TYPE IN ('C','M') THEN 
                CASE      
                    WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN           
                        CASE DBO.SRC_TBM_MATTER._HS_3PTY             
                            WHEN 0 then 'S'             
                            WHEN 1 then 'T'
                        END 
                    WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
                 END
         END AS TRANS_CODE

...