在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 &gt; 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] 过滤数据

mysql中的select语句where条件group by ,having , order by,limit的顺序及用法

快速掌握MySQL数据库中SELECT语句[2]

MySQL基础:过滤数据

MySQL命令:select查询语句

MySQL 查询语句SELECT和数据条件过滤