我想在sql语句中执行条件where
,并使用两个不同的条件,例如:在伪代码中:
procedure(..., bool_value IN boolean default false) is
....
begin
select * from mytable mt
where
if bool_value = true then mt.criterion_1 = value
else
mt_.criterion_2 = value; -- if boolean value is set, use criterion_1 column, otherwise use criterion_2 column
end
假设有可能,最好的方法是什么?
由于
答案 0 :(得分:6)
试试这个:
bool_value_string varchar2(5)
bool_value_string = case when bool_value then 'true' else 'false' end;
select * from mytable mt
where
(bool_value_string = 'true' and mt.criterion_1 = value)
or
(bool_value_string = 'false' and mt.criterion_2 = value)
基本上,将你的时间......然后成语转换为......或者一个。布尔字段是非空和真,意味着过滤器必须是第一个标准,或者不是,意味着过滤第二个标准。
答案 1 :(得分:2)
基本上,您的情况会被翻译为:
if bool_value = true
then mt.criterion_1 = value
else if bool_value = false
then mt_.criterion_2 = value;
由于您无法在select语句中直接使用布尔值(请参阅注释),请按以下方式使用:(将bool_value从布尔值更改为varchar2或数字)
procedure(..., bool_value IN varchar2(10) default 'FALSE') is
....
begin
select * from mytable mt
where
(case
when (bool_value = 'TRUE' and mt.criterion_1 = value) then (1)
when (bool_value = 'FALSE' and mt_.criterion_2 = value) then (1)
(else 0)
end) = 1;
OR
select * from mytable mt
where
(bool_value = 'TRUE' and mt.criterion_1 = value)
or
(bool_value = 'FALSE' and mt.criterion_2 = value)
end
原始回答
您还可以在case statement
子句中使用where
,如下所示:
select * from mytable mt
where
(case
when (bool_value = true and mt.criterion_1 = value) then (1)
when (bool_value = false and mt_.criterion_2 = value) then (1)
(else 0)
end) = 1;
在oracle中,您也可以使用以下Query。
select * from mytable mt
where
(bool_value = true and mt.criterion_1 = value)
or
(bool_value = false and mt.criterion_2 = value)
注意:由于默认为bool_value = false
,因此无需检查is null
条件。
答案 2 :(得分:1)
最简单的形式是:
WHERE (bool_value = TRUE AND mt.criterion_1 = value)
OR (bool_value = FALSE AND mt.criterion_2 = value)