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.