MySQL 存储过程 - Select 如果给定参数,否则将其排除

MySQL stored procedure - Select if parameter is given else exclude it

我有一个 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 作为日期的数据类型。使用 datedatetime。如果您不使用阻止使用索引的函数,您的查询可能会 运行 更快:

而不是

date(task_date) between date1 and date2

使用

task_date >= date1 and task_date < (date2 + interval 1 day)