Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using conditional where clauses in mysql select statement

Tags:

sql

select

mysql

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?

like image 990
namco Avatar asked Feb 05 '23 09:02

namco


2 Answers

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
like image 163
Ravi Avatar answered Feb 06 '23 22:02

Ravi


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.

like image 42
Mario Garrido Avatar answered Feb 07 '23 00:02

Mario Garrido