избегайте 'IF', если возможно, чтобы проверить другое условие в предложении where - PullRequest
0 голосов
/ 05 октября 2011

У меня есть запрос, в каком столбце используется выражение where в зависимости от параметра хранимой процедуры:

select * from tableName where col2=someValue 

вышеуказанный запрос выполняется, если inputparameter равен 'X' и если это 'Y' тогда

select * from tableName where col2=someValue 

Я могу написать блок if, проверяющий условие, а затем выполнить соответствующий запрос. но я пытаюсь объединить эти два запроса в один. Пожалуйста, помогите.

Ответы [ 4 ]

6 голосов
/ 05 октября 2011
SELECT * from tableName 
WHERE  ( inputparameter = 'X' AND  col1=someValue )
    OR ( inputparameter = 'Y' AND  col2=someValue )
       ;
5 голосов
/ 05 октября 2011
WHERE :SomeValue = DECODE(:InputParameter, 'X', Col1, 'Y', Col2)
0 голосов
/ 05 октября 2011

Все решения, построенные вокруг условий в «где» части запроса, работают, но не оптимально с точки зрения производительности. Поэтому, если tableName действительно большой, то лучшим вариантом будет построение динамического SQL или реализация этого случая как двух отдельных запросов.

Е.Г.

create or replace procedure GetSomething(
  inputParameter in varchar2, 
  someValue      in varchar2  
) 
  return sys_refcursor
as
  cRet sys_refcursor;
begin

  if(inputParam = 'X') then
    open cRet for 
       select * from tableName where col1 = someValue
    ;
  elsif(inputParam = 'Y') then
    open cRet for 
       select * from tableName where col2 = someValue
    ;
  else
    raise_application_error(-20001,'Invalid value of inputParameter.'); 
  end if;

end;

Конечно, для хорошей производительности оба столбца должны быть проиндексированы.

0 голосов
/ 05 октября 2011
select * from tableName 
where  1 = CASE
            when inputparameter = 'X'
            AND  col1=someValue 
            THEN 1
            when inputparameter = 'Y'
            AND  col2=someValue 
            THEN 1
            ELSE 0
           END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...