带有列 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.
我在函数内部使用 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
;
此外,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.