带有列 Like 条件的 where 子句中的案例

Case in where clause with column Like condition

我在函数内部使用 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 你找到了一个在检查 "empty strings" 时发现问题的例子。

此外,CASE在这里不是正确的选择;你最好添加一些布尔逻辑。

如果我理解得很好,如果参数为 "empty",则您希望 select 所有行,如果参数不是 "empty",则仅匹配行;这可能是一种方式:

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;    

测试:

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.