简体   繁体   中英

using conditional where clauses in mysql select statement

There is a stored procedure sp_select_from_persons in MySql. And there are 3 parameters inside this procedure. age, class, group . These parameter values can be -1 or another value. And these parameters will be used in where clause.
Now I want to write where clause like that, if any value of these parameter is another than -1 then append them into where clause. For example:
if age = -1, class = 7 and group = 5 then select query will be:

SELECT * FROM persons p WHERE p.class = class AND p.group = group;  

or if age = 25, class = -1 and group = -1 then:

SELECT * FROM persons p WHERE p.age = 25;

and etc.

I don't want to use emnedded IF statements like below:

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

Is there a better way to do this?

This is a single line query.... Try This

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

Something like this also worked for me:

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

My requirement is that the stored proc is being called from a Java/SpringFramework-based back-end where passing null values to stored proc invocation is not accepted so values are set to empty string.

You can use the logical or operator to crate this behavior in a single statement:

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM