2012-05-09 344 views
0

我在位於where子句中的最後一個CASE語句中收到編譯器錯誤。我似乎無法弄清楚我做錯了什麼...任何幫助,將不勝感激你。在IF語句中嵌套Case語句

P1: BEGIN 
DECLARE cursor1 CURSOR WITH RETURN FOR 
    SELECT DISTINCT MPWBIPS.MIP_NO,         
     MPWBIPS.ITEM_NO,         
     MPWBIPS.MATL_PLNR_ID,        
     MPWBIPS.ITEM_OBS_STATUS,      
     MPWBMIT.EXCS_ITEM_COST_TOT, 
     MPWBMIP.TRGT_CHGOVR_DATE, 
     SLOTLOC.LOT_FROM_EFF_DATE,    
    FROM MPWBIPS MPWBIPS           
    INNER JOIN MPWBMIT MPWBMIT 
     ON MPWBMIT.MIP_NO = MPWBIPS.MIP_NO    
     AND MPWBMIT.ITEM_NO = MPWBIPS.ITEM_NO 
    INNER JOIN MPPLNR MPPLNR 
     ON MPWBIPS.MATL_PLNR_ID = MPPLNR.MATL_PLNR_ID 
    INNER JOIN MPWBMIP MPWBMIP 
     ON MPWBIPS.MIP_NO = MPWBMIP.MIP_NO 
    INNER JOIN SMPROJ_DPIMS SMPROJ 
     ON MPWBIPS.MIP_NO = SMPROJ.MIP_NO 
    INNER JOIN SLOTLOC_DPIMS SLOTLOC 
     ON SMPROJ.MFG_CHGOVR_PER = SLOTLOC.LOT 

    WHERE plannerID = 
     CASE WHEN mgrIndc = 'Y' THEN 
      MPPLNR.MGR_LID 
     WHEN suprvIndc = 'Y' THEN 
      MPPLNR.SPRVSR_LID 
     WHEN plannerID = '' THEN 
      '' 
     ELSE 
      MPPLNR.MATL_PLNR_ID 
     END 

     AND CASE WHEN obsStatus = 'ACTION' THEN 
        MPWBIPS.ITEM_OBS_STATUS <> 'RESOLVED 99' 
        AND MPWBIPS.ITEM_OBS_STATUS <> 'EXCESS 90' 
       WHEN obsStatus = 'ALL' OR obsStatus = '' THEN 
        obsStatus = '' 
       ELSE 
        MPWBIPS.ITEM_OBS_STATUS = obsStatus 
       END 
     AND (COALESCE(mipNo, '') = '' OR MPWBIPS.MIP_NO = mipNo); 
OPEN cursor1; 

END P1

+0

表達式不站在自己的,他們需要被分配到的東西,一個變量或一列。您想做什麼? –

+0

我已經刪除了if,並且上面的case語句仍然不能編譯。 – Ted

回答

1

不能嵌套if語句中case聲明。考慮一下,重寫你的查詢。

您在最後缺少case。您case語句應該是

CASE WHEN obsStatus = 'ACTION' THEN 
MPWBIPS.ITEM_OBS_STATUS <> 'RESOLVED 99' 
AND MPWBIPS.ITEM_OBS_STATUS <> 'EXCESS 90' 
WHEN obsStatus = 'ALL' OR obsStatus = '' THEN      
obsStatus = ''     
ELSE      
MPWBIPS.ITEM_OBS_STATUS = obsStatus 
END CASE 

編輯:

<>(不等於)運算符創建的問題;你不能在那裏使用它們。不確定你使用的情況不相等。下面兩個線路

MPWBIPS.ITEM_OBS_STATUS <> 'RESOLVED 99' 
AND MPWBIPS.ITEM_OBS_STATUS <> 'EXCESS 90' 

可能使你的Where條件是這樣的:

WHERE plannerID = 
(CASE WHEN mgrIndc = 'Y' THEN    
MPPLNR.MGR_LID   
WHEN suprvIndc = 'Y' THEN    
MPPLNR.SPRVSR_LID   
WHEN plannerID = '' THEN ''   
ELSE MPPLNR.MATL_PLNR_ID   
END)   

AND 

((obsStatus = 'ACTION') and (MPWBIPS.ITEM_OBS_STATUS <> 'RESOLVED 99' 
AND MPWBIPS.ITEM_OBS_STATUS <> 'EXCESS 90')) 

or 

((obsStatus = 'ALL' OR obsStatus = '') and (obsStatus = '')) 

or 

MPWBIPS.ITEM_OBS_STATUS = obsStatus 

AND 

(COALESCE(mipNo, '') = '' OR MPWBIPS.MIP_NO = mipNo); 
+0

我已經刪除了如上所示的if語句。它自己的案例聲明仍然沒有編譯。 – Ted

+0

請參閱我的編輯。 – Rahul

+0

沒有區別。 END和END CASE的評估結果相同。 – Ted

2

不要以爲你可以在這個方法中,如果使用。你可以嵌套案件。

case when parm1 <> '' THEN 
      CASE parm1 
       WHEN '1' THEN 
        --do something 
       WHEN '2' THEN 
        --do something 
       ELSE 
        --do something 
      END 
end 

但是爲什麼?而不是隻添加到您的情況

  CASE parm1 

       WHEN '1' THEN 
        --do something 
       WHEN '2' THEN 
        --do something 
       WHEN <> '' 
        --do something 
      END