2012-05-09 241 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