在 IF 语句中嵌套 Case 语句
Posted
技术标签:
【中文标题】在 IF 语句中嵌套 Case 语句【英文标题】:Nesting a Case statement within an IF statement 【发布时间】: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语句还是编译不出来。 【参考方案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
编辑:
<>
(不等于)操作员正在制造问题;你不能在那里使用它们。不确定为什么您使用 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可以保存并成功部署。以上是关于在 IF 语句中嵌套 Case 语句的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在switch-case语句下嵌套if-else语句会报错?怎么改?
if…else语句嵌套if…ELSE语句和case语句实现分支选择的区别
if…else语句嵌套if…ELSE语句和case语句实现分支选择的区别
有啥方法可以减少程序中条件语句if-else或者switch-case的过多嵌套?