我有一个Oracle函数,它有3个参数,并使用参数来设置多个联合语句中的where子句值。这是伪代码:
create or replace function fn_newfunction
(IN_1_id in VARCHAR2, IN_2 in VARCHAR2, IN_3 in VARCHAR2)
RETURN T_varchar_table AS
v_tab T_varchar_table;
begin
select
cast(multiset (
--add users
select * from table1 opt where opt.col2 = IN_2 and opt.col3 = IN_3 and opt.col1 = IN_1_id
union
...
<insert 10+ select statements here with same values>
) as T_varchar_table)
END
into v_tab
from dual;
return v_tab;
end;
一个用例已经出现将空白值传递给任何IN参数的函数,并让它在参数为空的where子句中选择ANY值。例如,如果IN_1_id传递一个空值,第一个select语句中的where子句将显示opt.col1中ANY值(偶数为null)的位置。我怎样才能做到这一点?谢谢!
答案 0 :(得分:2)
我经常使用的逻辑(尽管不在Oracle中)如下。我把它写成伪,只是因为正如我所提到的,我相信这是一个更方法论的问题,而不是语法。
Function (@Parameter1, @Parameter2)
SELECT * FROM MyTable
WHERE
--Parameter1
(@Parameter1 IS NULL OR MyTable.Parameter1 = @Parameter1)
AND
--Parameter2
(@Parameter2 IS NULL OR MyTable.Parameter2 = @Parameter2)
如果您未通过@Parameter1
:
--This evaluates to TRUE for every single row, because the first condition has been met
(@Parameter1 IS NULL OR MyTable.Parameter1 = @Parameter1)
如果你做传递@Parameter1
:
--The first condition will never be met, because @Parameter1 is NOT NULL.
--The second condition will only be met for rows that match the parameter.
(@Parameter1 IS NULL OR MyTable.Parameter1 = @Parameter1)
使用此方法,您可以有条件地将字段添加到WHERE
子句中。
答案 1 :(得分:0)
您可以使用动态SQL来解决您的问题
if IN_1_id is not null then
lv_where := ' and opt.col1 =IN_1_id1 ';
else
lv_where :=' ';
end if;
EXECUTE IMMEDIATE 'select * from table1 opt where opt.col2 = IN_2 and opt.col3 = IN_3 ' ||lv_where ;