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
作为日期的数据类型。使用 date
或 datetime
。如果您不使用阻止使用索引的函数,您的查询可能会 运行 更快:
而不是
date(task_date) between date1 and date2
使用
task_date >= date1 and task_date < (date2 + interval 1 day)
我有一个 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
使用
task_date >= date1 and task_date < (date2 + interval 1 day)