【问题标题】:Nesting a Case statement within an IF statement在 IF 语句中嵌套 Case 语句
【发布时间】:2012-05-09 16:56:07
【问题描述】:

我在 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;

结束P1

【问题讨论】:

  • 表达式不是独立存在的,它们需要分配给某个东西,一个变量或一个列。你想做什么?
  • 我把if去掉了,上面的case语句还是编译不出来。

标签: sql db2 case


【解决方案1】:

不要认为你可以在这个方法中使用 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

【讨论】:

    【解决方案2】:

    您不能将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 
    

    编辑:

    &lt;&gt;(不等于)操作员正在制造问题;你不能在那里使用它们。不确定为什么您使用 Not equal in 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); 
    

    【讨论】:

    • 我已经删除了如上所示的 if 语句。它自己的 case 语句仍未编译。
    • 没有区别。 END 和 END CASE 评估相同。
    • 那么,您的案例陈述看起来不错。问题出在查询的其他地方。发布有问题的查询。
    • 是case语句。删除后,proc可以保存并成功部署。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2011-03-12
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多