我在函数内部使用SQL查询 . 现在我想将参数值传递给SQL where子句,如果param_value不是空的,如下所示 .
select * from cms_tab where case when param_val <> '' then col1 like '%' || param_val || '%' end
怎么做到这一点?
如果参数值不为null,那么我想使用like(%)获取记录 .
select * from cms_tab where param_val is null or col1 like '%'||param_val||'%'
在Oracle中检查字符串是否为"empty"的唯一安全方法是检查它是否 IS [NOT] NULL ; here您找到了一个问题示例,您可以在检查"empty strings"错误的方式时找到这些问题 .
IS [NOT] NULL
此外, CASE 不是这里的正确选择;你最好添加一些布尔逻辑 .
CASE
如果我理解的话,你想要在参数为“空”时选择所有行,或者如果参数不是“空”则只选择匹配的行;这可能是一种方式:
create or replace procedure testNull ( param_val IN varchar2) is vCount number; begin select count(*) into vCount from cms_tab where param_val is null or col1 like '%' || param_val || '%' ; dbms_output.put_line('vCount = ' || vCount); end;
Test:
create table cms_tab(col1) as ( select 'xxx ABC yyy' from dual union all select 'xxxxxxxxxxxx' from dual ) SQL> exec testNull(null); vCount = 2 PL/SQL procedure successfully completed. SQL> exec testNull(''); vCount = 2 PL/SQL procedure successfully completed. SQL> exec testNull('ABC'); vCount = 1 PL/SQL procedure successfully completed. SQL> exec testNull('ZZZ'); vCount = 0 PL/SQL procedure successfully completed.
2 回答
试试这个:
在Oracle中检查字符串是否为"empty"的唯一安全方法是检查它是否
IS [NOT] NULL
; here您找到了一个问题示例,您可以在检查"empty strings"错误的方式时找到这些问题 .此外,
CASE
不是这里的正确选择;你最好添加一些布尔逻辑 .如果我理解的话,你想要在参数为“空”时选择所有行,或者如果参数不是“空”则只选择匹配的行;这可能是一种方式:
Test: