如何在oracle的where子句中使用case语句?

如何在oracle的where子句中使用case语句?,oracle,plsql,case,Oracle,Plsql,Case,当我运行以下脚本时,我得到PL/SQL:ORA-00905:missing关键字错误 create or replace procedure testing (ass_line in char, curs out sys_refcursor ) is begin open curs for select asl.Production_Group,asl.last_sequence_nbr from ASSEMBLY_LINE asl where(case when ass_line=

当我运行以下脚本时,我得到PL/SQL:ORA-00905:missing关键字错误

create or replace procedure testing
(ass_line in char,
 curs out sys_refcursor
)
is
begin
open curs for 
select asl.Production_Group,asl.last_sequence_nbr
from ASSEMBLY_LINE asl
where(case 
   when ass_line='551F'
     then asl.assembly_line in('551F','551C','551S')
   else
     asl.assembly_line=ass_line
   end);
end;

请帮帮我

你不能那样使用
案例
,你必须使用

select asl.Production_Group,asl.last_sequence_nbr 
from ASSEMBLY_LINE asl
where(  (ass_line='551F' and asl.assembly_line in('551F','551C','551S')
     or (asl.assembly_line=ass_line)
     );
您应该使用:

where (ass_line  = '551F' and asl.assembly_line in('551F','551C','551S')) or
      (ass_line != '551F' and asl.assembly_line = ass_line)

对于那些真正需要where条款中的案例陈述的人来说

 where (case
          when ass_line = '551F' then
           case
              when asl.assembly_line in ('551F', '551C', '551S') then
               1
              else
               0
           end
          else
          case
             when asl.assembly_line = ass_line then
              1
             else
             0
          end
       end) = 1

除了语义不正确的
大小写
表达式外,不允许选择
进入
光标变量使用
打开
statement@Nicholas克拉斯诺夫。谢谢你的回复。我已经更新了我的帖子。我按照帖子中提到的方式运行了这个过程,但是在编译过程时我发现缺少关键字。请参阅Tony和/或David的答案。仅供参考,您应该真正使用
varchar2
来处理字符串(或
table.column%type
),而不是
char
,这有一系列的怪癖,更可能导致奇怪的错误,而不是有用的。谢谢你的回复。但它显示了相同的错误。这是因为您无法选择一个游标变量(请参阅Nicholas对您的问题的评论)。所以我可以使用嵌套表吗?是的,或者您可以为
@BabybNukes编写
打开游标是的,正如我的回答所说,您的SQL仍然不正确!第二个字符后缺少CASE/END关键字else@Rene. 非常感谢你的回复,它很有效。你能告诉我结尾处的“end)=1”吗?至少分配1时会发生什么?dat 1代表什么?它不是赋值,而是关系运算符。case语句的结果为1或0。您只选择case语句结果为1的记录。感谢您接受这个答案,但Tony Andrews的解决方案要简单得多,而且在我看来是更好的答案。我给出这个答案只是为了说明如何在where子句中使用case语句。有些人可能正在寻找这个问题,你的问题的标题可能会吸引他们到这个页面。