MySQL存储过程-选择是否给定参数,否则将其排除

MySQL存储过程-选择是否给定参数,否则将其排除,mysql,mysql-workbench,mysql-python,Mysql,Mysql Workbench,Mysql Python,我有一个mysql存储过程,如果没有给出参数的值,我需要排除它。 如果我使用两个参数调用存储过程,它应该能够在不考虑程序条件的情况下运行 我的当前查询 DELIMITER // CREATE PROCEDURE GetUtilization2( IN programName VARCHAR(30), IN date1 VARCHAR(20), IN date2 VARCHAR(20) ) BEGIN SELECT SUM(task_hours) as tota

我有一个mysql存储过程,如果没有给出参数的值,我需要排除它。 如果我使用两个参数调用存储过程,它应该能够在不考虑程序条件的情况下运行

我的当前查询

DELIMITER //

CREATE PROCEDURE GetUtilization2(
    IN programName VARCHAR(30),
    IN date1 VARCHAR(20),
    IN date2 VARCHAR(20)
)
BEGIN
    SELECT 
SUM(task_hours) as total,
(SUM(CASE when task_category = 'Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS production,
(SUM(CASE when task_category = 'Non Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS non_production,
(SUM(CASE when task_category = 'Training' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS Training,
(SUM(CASE when task_category = 'Absenteeism' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS Absenteeism,
(SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END) /((SUM(task_hours)-SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END)))) * 100 AS OT
    FROM data_table
    WHERE program = programName and date(task_date)  between date1 and date2;
    
END //

DELIMITER ;
预期产出

**If Program not given exclude program from query** 

DELIMITER //

CREATE PROCEDURE GetUtilization2(
    IN programName VARCHAR(30),
    IN date1 VARCHAR(20),
    IN date2 VARCHAR(20)
)
BEGIN
    SELECT 
SUM(task_hours) as total,
(SUM(CASE when task_category = 'Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS production,
(SUM(CASE when task_category = 'Non Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS non_production,
(SUM(CASE when task_category = 'Training' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS Training,
(SUM(CASE when task_category = 'Absenteeism' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100  AS Absenteeism,
(SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END) /((SUM(task_hours)-SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END)))) * 100 AS OT
    FROM data_table
    WHERE date(task_date)  between date1 and date2;
    
END //

DELIMITER ;

可选:你能以更有效的方式进行查询吗

WHERE (programName is null or program = programName)
  AND date(task_date) between date1 and date2;
不要使用
varchar
作为日期的数据类型。使用
date
datetime
。如果不使用阻止使用索引的函数,查询可能会运行得更快:

而不是

date(task_date) between date1 and date2
使用

任务日期>=日期1和任务日期<(日期2+间隔1天)
task_date >= date1 and task_date < (date2 + interval 1 day)