避免'IF',如果可能的话检查where子句中的不同条件

时间:2011-10-05 09:49:50

标签: sql oracle

我有一个查询,其中where子句中使用的列根据参数而更改 存储过程:

select * from tableName where col2=someValue 
如果inputparameter为'X',则运行

以上查询 它是'Y'然后

select * from tableName where col2=someValue 

我可以写一个if块检查条件,然后执行相应的查询。 但我试图将这两个查询合二为一。 请帮忙。

4 个答案:

答案 0 :(得分:6)

SELECT * from tableName 
WHERE  ( inputparameter = 'X' AND  col1=someValue )
    OR ( inputparameter = 'Y' AND  col2=someValue )
       ;

答案 1 :(得分:5)

WHERE :SomeValue = DECODE(:InputParameter, 'X', Col1, 'Y', Col2)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

所有解决方案都围绕“where”部分查询中的条件构建,但从性能角度来看并非最佳。因此,如果tableName非常大,则更好的变体是构建动态sql或将此情况实现为两个单独的查询。

E.g。

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;

当然,必须将两列都编入索引才能获得良好的性能。