0

where 句にある最後の 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

4

2 に答える 2

2

このメソッドで if を使用できるとは思わないでください。ただし、ケースをネストできます。

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
于 2012-05-09T17:01:17.243 に答える
1

caseステートメント内にステートメントをネストすることはできませんif。クエリを書き直すことを検討してください。

あなたは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 

編集:

<>(等しくない) 演算子が問題を引き起こしています。そこでは使えません。ケース条件で Not equal を使用している理由がわからない。2行目以下

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); 
于 2012-05-09T17:03:30.050 に答える