我有一个查询,其中where子句中使用的列根据参数而更改 存储过程:
select * from tableName where col2=someValue
如果inputparameter为'X',则运行以上查询 它是'Y'然后
select * from tableName where col2=someValue
我可以写一个if块检查条件,然后执行相应的查询。 但我试图将这两个查询合二为一。 请帮忙。
答案 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;
当然,必须将两列都编入索引才能获得良好的性能。