Как использовать оператор case внутри предложения where в oracle?

#oracle #plsql #case

#Oracle #plsql #case

Вопрос:

Я получаю PL / SQL: ORA-00905: ошибка с отсутствующим ключевым словом при запуске следующего скрипта

 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;
  

Пожалуйста, помогите мне

Комментарии:

1. Помимо семантически неправильного case выражения, не разрешается выбирать into инструкцию использования open <cursor_variable> for переменной курсора

2. @Николай Краснов. Спасибо за ответ. Я обновил свой пост. Я запускаю процедуру, как указано в сообщении, но при компиляции процедуры я получаю недостающее ключевое слово.

3. Смотрите ответ Тони и / или Дэвида.

4. к вашему сведению, вам действительно следует использовать varchar2 for strings (или table.column%type ), а не char , который имеет ряд особенностей, которые, скорее всего, вызовут странные ошибки, чем будут полезны.

Ответ №1:

Для тех, кто попадает сюда, кому действительно нужен оператор case в предложении 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
  

Комментарии:

1. вы пропускаете ключевые слова CASE / END после второго else

2. @Rene. Большое спасибо за ответ. Это работает. Не могли бы вы, пожалуйста, рассказать мне о «end) = 1» в конце? Что происходит, когда 1 присваивается в atlast? Что представляет dat 1?

3. Это не присваивание, а оператор отношения. Результатом оператора case является либо 1, либо 0. Вы выбираете только те записи, в которых оператор case приводит к 1. Спасибо, что приняли это как ответ, но решение Тони Эндрюса намного проще и, на мой взгляд, лучший ответ.

4. Я дал этот ответ только для того, чтобы показать, как использовать оператор case в предложении where. Некоторые люди могут искать это, и заголовок вашего вопроса, возможно, привлек их на эту страницу.

Ответ №2:

Вы не можете использовать case таким образом, вы должны использовать or :

 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)
     );
  

Комментарии:

1. Спасибо за ответ. Но он показывает ту же ошибку.

2. Это потому, что вы не можете выбрать в переменной курсора (см. Комментарий Николаса к вашему вопросу)

3. .Так могу ли я использовать вложенную таблицу?

4. Да, или вы можете написать open curs for <your select statement> .

5. @BabyboBNukes Да, ваш SQL по-прежнему неверен, как сказано в моем ответе!

Ответ №3:

Вы должны использовать:

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