2017-08-11 55 views
0

我有一個要評估的值列表。下面提供將列與過程的值進行比較

'16-%', '45-%','A1%','125%' 

實施例然後,我有1列,它是一個存儲過程的輸出和第4列,其獲得由混疊左外返回聯接

例如:

Max(db_util.Efn_name_wid(tdl_tran.reason_code_id, 
       remit_rmc.remit_code_id, remit_rmc.remit_code_name, 'Reason') 
) AS DEN_REASON 

, Max(RMC_1.remit_code_name) 
     AS REMIT_CD1 

,Max(RMC_2.remit_code_name) 
     AS REMIT_CD2 

,Max(RMC_3.remit_code_name) 
     AS REMIT_CD3 

,Max(RMC_4.remit_code_name) 
     AS REMIT_CD4 

邏輯我我試圖建立的是:

如果DEN_REASON like(列表中的任何值)

然後,如果它與列表中的任何值匹配,則對列remit_cd1進行評估,然後繼續remit_cd2,remit_cd3,remit_cd4,直到找到與列表中的值不匹配的第一個匯款代碼。

最終試圖返回一個值。

回答

0

我覺得這個CASE語句可能是你需要的東西:

SELECT CASE 
    WHEN DEN_REASON LIKE (/* your set of values */) 
     AND REMIT_CD1 LIKE (/* your set of values */) 
     AND REMIT_CD2 LIKE (/* your set of values */) 
     AND REMIT_CD3 LIKE (/* your set of values */) 
     AND REMIT_CD4 NOT LIKE (/* your set of values */) 
     THEN REMIT_CD4 
    WHEN DEN_REASON LIKE (/* your set of values */) 
     AND REMIT_CD1 LIKE (/* your set of values */) 
     AND REMIT_CD2 LIKE (/* your set of values */) 
     AND REMIT_CD3 NOT LIKE (/* your set of values */) 
     THEN REMIT_CD3 
    WHEN DEN_REASON LIKE (/* your set of values */) 
     AND REMIT_CD1 LIKE (/* your set of values */) 
     AND REMIT_CD2 NOT LIKE (/* your set of values */) 
     THEN REMIT_CD2 
    WHEN DEN_REASON LIKE (/* your set of values */) 
     AND REMIT_CD1 NOT LIKE (/* your set of values */) 
     THEN REMIT_CD1 
    WHEN DEN_REASON NOT LIKE (/* your set of values */) 
     THEN DEN_REASON 
    END AS YourSingleResult 

FROM --your query 
( SELECT 
    Max(db_util.Efn_name_wid(tdl_tran.reason_code_id, 
     remit_rmc.remit_code_id, remit_rmc.remit_code_name, 'Reason') 
     ) AS DEN_REASON 
    ,Max(RMC_1.remit_code_name) AS REMIT_CD1 
    ,Max(RMC_2.remit_code_name) AS REMIT_CD2 
    ,Max(RMC_3.remit_code_name) AS REMIT_CD3 
    ,Max(RMC_4.remit_code_name) AS REMIT_CD4 
    -- and the rest of your query, that you omitted from your example above 
) 

話又說回來,它可能會,如果你在你的子查詢沒有你的LIKE evals更短。像這樣:

SELECT CASE 
    WHEN MatchesDenReason = 1 
     AND MatchesCD1 = 1 
     AND MatchesCD2 = 1 
     AND MatchesCD3 = 1 
     AND MatchesCD4 = 0 
     THEN REMIT_CD4 
    WHEN MatchesDenReason = 1 
     AND MatchesCD1 = 1 
     AND MatchesCD2 = 1 
     AND MatchesCD3 = 0 
     THEN REMIT_CD3 
    WHEN MatchesDenReason = 1 
     AND MatchesCD1 = 1 
     AND MatchesCD2 = 0 
     THEN REMIT_CD2 
    WHEN MatchesDenReason = 1 
     AND MatchesCD1 = 0 
     THEN REMIT_CD1 
    WHEN MatchesDenReason = 0 
     THEN DEN_REASON 
    END AS YourSingleResult 

FROM --your query 
( SELECT 
    Max(db_util.Efn_name_wid(tdl_tran.reason_code_id, 
     remit_rmc.remit_code_id, remit_rmc.remit_code_name, 'Reason') 
     ) AS DEN_REASON 
    ,CASE WHEN Max(db_util.Efn_name_wid(tdl_tran.reason_code_id, 
     remit_rmc.remit_code_id, remit_rmc.remit_code_name, 'Reason') 
     ) LIKE (/* your list */) 
      THEN 1 ELSE 0 END AS MatchesDenReason 
    ,Max(RMC_1.remit_code_name) AS REMIT_CD1 
    ,CASE WHEN Max(RMC_1.remit_code_name) LIKE (/* your list */) 
      THEN 1 ELSE 0 END AS MatchesCD1 
    ,Max(RMC_2.remit_code_name) AS REMIT_CD2 
    ,CASE WHEN Max(RMC_2.remit_code_name) LIKE (/* your list */) 
      THEN 1 ELSE 0 END AS MatchesCD2 
    ,Max(RMC_3.remit_code_name) AS REMIT_CD3 
    ,CASE WHEN Max(RMC_3.remit_code_name) LIKE (/* your list */) 
      THEN 1 ELSE 0 END AS MatchesCD3 
    ,Max(RMC_4.remit_code_name) AS REMIT_CD4 
    ,CASE WHEN Max(RMC_4.remit_code_name) LIKE (/* your list */) 
      THEN 1 ELSE 0 END AS MatchesCD4 
    -- and the rest of your query, that you omitted from your example above 
) 
相關問題