MySQL存储过程-选择是否给定参数,否则将其排除
我有一个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
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)