【问题标题】:using conditional where clauses in mysql select statement在mysql select语句中使用条件where子句
【发布时间】: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

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: mysql sql select


    【解决方案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) ;
        猜你喜欢
        • 1970-01-01
        • 2010-12-07
        • 2023-03-15
        • 2012-01-26
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 2018-09-02
        • 2022-11-10
        相关资源
        最近更新 更多