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

问题描述

我有一个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),(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 ;

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

解决方法

2 puppeteer windows

请勿将WHERE (programName is null or program = programName) AND date(task_date) between date1 and date2; 用作日期的数据类型。使用varchardate。如果您不使用阻止使用索引的函数,则查询的运行速度可能会更快:

代替

datetime

使用

date(task_date) between date1 and date2