2011-10-05 46 views
0

我有一个查询,其中列在其中在改取决于被存储的过程的参数 子句中使用:避免“IF”,如果可能的话,以检查在不同条件where子句

select * from tableName where col2=someValue 

上述查询运行如果inputparameter是“X”,并且如果 它是“Y”则

select * from tableName where col2=someValue 

如果块为条件检查,然后执行相应的查询我可以写一个。 但我想将这两个查询合并为一个。 请帮忙。

+5

看起来像一个剪切和粘贴错误给我。他们是同一个查询。 – duffymo

+1

这两个查询有什么不同? – Saket

+2

我相信,OP是询问输入参数是否为'X',然后SELECT * FROM table WHERE col1 = value AND如果输入参数是'Y',那么SELECT * FROM表WHERE col2 =值 – roartechs

回答

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 
+0

plz,schurik请问explin query.1 = case部分 –

+0

'1 = CASE'与'ELSE 0'组合使得SQL返回什么也没有,如果inputparameter是'X'或'Y'以外的东西。 –

+0

@NirajChoubey:我也在为这个答案苦苦挣扎,但是当我将它与wildplasser的答案进行比较时我就明白了。 – user272735

6
SELECT * from tableName 
WHERE (inputparameter = 'X' AND col1=someValue) 
    OR (inputparameter = 'Y' AND col2=someValue) 
     ; 
5
WHERE :SomeValue = DECODE(:InputParameter, 'X', Col1, 'Y', Col2) 
0

在周围建条件“其中”查询的一部分,正在所有的解决方案,但是从性能的角度来看不是最佳的。因此,如果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; 

当然,两列都必须进行索引以获得良好性能。