2012-05-09 3 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 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 문을 제거했습니다. 그 자체의 case 문은 여전히 ​​컴파일되지 않습니다. – Ted

+0

Pls, 내 편집 참조. – 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