如果参数为空,请更改where子句

时间:2017-01-11 22:09:08

标签: sql oracle function

我有一个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)的位置。我怎样才能做到这一点?谢谢!

2 个答案:

答案 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 ;