位置-案例陈述导致ORA-00905:缺少关键字

时间:2019-02-28 22:29:29

标签: oracle case where

select field1, field2
from table
where
(CASE
           WHEN :P_AccountType =  'B'  THEN  GLCC.SEGMENT2 <  '40000'
           WHEN :P_AccountType =  'P'  THEN  GLCC.SEGMENT2 >= '40000'
ELSE  
           GLCC.SEGMENT2 BETWEEN '00000' AND '99999' 
END)

看不到哪个关键字丢失。请帮助。请参阅下面的背景。

用户可以选择Accountype A =试用余额帐户'00000'-'99999'B = BS帐户'00000'-'39999'P =所有IS帐户'40000'-'99999'此变量产生一个范围。因此:P_AccountType = B Segment2应该包含所有资产负债表帐户'00000'-'39999'等。segment2的值是字符串

1 个答案:

答案 0 :(得分:0)

您不能使用case表达式有选择地应用其他条件。在这种情况下,我认为这是在抱怨它碰到<>=between时特别抱怨-它们都是错误的,而不是解析器期望在那里看到的。 (期望前两个另外还有whenelseend;第三个是end。)

您可以改为使用布尔逻辑,例如:

select field1, field2
from table
where
   (:P_AccountType = 'B' and GLCC.SEGMENT2 <  '40000')
or (:P_AccountType = 'P' and GLCC.SEGMENT2 >= '40000')
or (:P_AccountType not in ('B', 'P') and GLCC.SEGMENT2 BETWEEN '00000' AND '99999')

或者在您的最后一段中,最后一行可能是:

or (:P_AccountType = 'A' and GLCC.SEGMENT2 BETWEEN '00000' AND '99999')

我不确定'P'的第二个条件是否也需要上限;或者实际上B需要一个下限。用字符串很难分辨。 A情况可能根本不需要范围检查。不过要取决于您的数据。