在mysql select语句中使用条件where子句
Posted
技术标签:
【中文标题】在mysql select语句中使用条件where子句【英文标题】:using conditional where clauses in mysql select statement 【发布时间】:2017-05-29 06:58:11 【问题描述】:mysql中有一个存储过程sp_select_from_persons
。这个过程中有3个参数。 age, class, group
。这些参数值可以是 -1 或其他值。这些参数将在where
子句中使用。
现在我想写这样的 where 子句,如果这些参数的任何值不是 -1 则将它们附加到 where
子句中。例如:
如果 age = -1, class= 7 和 group = 5 那么选择查询将是:
SELECT * FROM persons p WHERE p.class = class AND p.group = group;
或者如果年龄 = 25, class= -1 并且组 = -1 那么:
SELECT * FROM persons p WHERE p.age = 25;
等等
我不想使用如下嵌入的 IF 语句:
IF age > 0 THEN
IF class > 0 THEN
IF group > 0 THEN
SELECT * FROM persons p WHERE p.age = age AND p.class = class AND p.group = group;
END IF
ELSE ....... etc
有没有更好的方法来做到这一点?
【问题讨论】:
【参考方案1】:这是一个单行查询....试试这个
SELECT * FROM persons p
WHERE p.age = case when age = -1 then p.age else age end
and p.class = case when class = -1 then p.class else class end
and p.group = case when group = -1 then p.group else group end
【讨论】:
【参考方案2】:这样的事情也对我有用:
create procedure sp_my_proc(in p1 varchar(10), in p2 int)
begin
SELECT col1, col2 from my_table
where if(p1 is null or length(trim(p1)) = 0, true, col1 = p1)
and if(p2 = 0, true, col2 = p2);
end
我的要求是从Java/SpringFramework-based
后端调用存储过程,其中不接受将空值传递给存储过程调用,因此值设置为空字符串。
【讨论】:
【参考方案3】:您可以使用逻辑 or
运算符在单个语句中创建此行为:
SELECT *
FROM persons p
WHERE (age < 0 OR p.age = age) AND
(class < 0 OR p.class = class) AND
(group < 0 OR p.group = group);
【讨论】:
在(age > 0 OR p.age = age)
中应该是AND,否则如果传入年龄,它将始终匹配?
@NigelRen by bad - 它应该是“age 0 OR p.age = age” - 你通过了 -1(或者你忽略了p.age
)或者年龄匹配。
Select * from myTable where (Negative conditions OR positive conditions) AND (Negative conditions OR positive conditions) ;以上是关于在mysql select语句中使用条件where子句的主要内容,如果未能解决你的问题,请参考以下文章
mysql中的select语句where条件group by ,having , order by,limit的顺序及用法