我有一个存储过程,它接收 6 个变量,这些变量可能为 null,也可能不为 null,具体取决于应用在我的 Web 项目前端的过滤器。但是,目前即使所有过滤器都设置为空,此存储过程也不会返回任何内容。如果这有所作为,我正在使用 MySQL Workbench。以前我一直根据应用的过滤器使用单独的存储过程,但是随着我添加过滤器,这变得太难管理了。
CREATE DEFINER=`root`@`localhost` PROCEDURE `spFiltersGet`(IN jAlertId int, IN timeFrom timestamp, IN timeTo timestamp, IN seconds int, IN alertStatus varchar(255), IN jHostName varchar(255))
BEGIN
DECLARE timeFromVal TIMESTAMP;
DECLARE timeToVal TIMESTAMP;
DECLARE fetchVal INT;
DECLARE offsetVal INT;
DECLARE alertIdVal INT;
DECLARE secondsVal INT;
DECLARE statusVal varchar(255);
DECLARE hostVal varchar(255);
SET timeFromVal = timeFrom;
SET timeToVal = timeTo;
SET fetchVal = 10;
SET offsetVal = 0;
SET alertIdVal = jAlertId;
SET secondsVal = seconds;
SET statusVal = alertStatus;
SET hostVal = jHostName;
SELECT * FROM job_alert
WHERE
(alertIdVal IS NULL OR alert_id = jAlertId)
AND (timeFromVal IS NULL && timeToVal IS NULL
OR start_time BETWEEN timeFromVal AND timeToVal)
AND (secondsVal IS NULL
OR time_diff >= seconds)
AND (statusVal IS NULL
OR status = alertStatus)
AND (hostVal IS NULL OR host_name = jHostName)
ORDER BY alert_id DESC
LIMIT OFFSETVAL , FETCHVAL;
END
如果没有应用过滤器,即所有过滤器都设置为 null,我希望在将其转换为 JSON 后得到这种输出:
{
error: "null",
jobStatus: "SUCCESS",
startTime: "Sep 9, 2016 10:42:54 AM",
endTime: "Sep 9, 2016 10:42:55 AM",
timeDiff: 1217,
runCount: 2,
jobInstanceId: 834,
host: "IT2561",
nextRun: "Sep 9, 2016 10:52:54 AM",
jobCount: 11,
name: "Gift Certificate Delivery",
id: 6,
description: "Gift Certificate Delivery"
}
我是通过查看 StackOverflow 的其他答案来写这篇文章的,所以我假设我错过了一些东西。我的控制台没有收到任何错误,它只是不返回任何记录。
最佳答案
我已经尝试修复它,没有任何数据很难编写查询。检查一下,如果有什么问题告诉我。我也删除了你的变量,你不需要它们:
CREATE PROCEDURE `spFiltersGet`(
IN jAlertId int, IN timeFrom timestamp, IN timeTo timestamp,
IN seconds int, IN alertStatus varchar(255), IN jHostName varchar(255))
BEGIN
DECLARE _fetchVal INT;
DECLARE _offsetVal INT;
SET _fetchVal = 10;
SET _offsetVal = 0;
SELECT
*
FROM
job_alert
WHERE
alert_id = IFNULL(jAlertId, alert_id) -- id
AND
((timeFrom IS NULL AND timeTo IS NULL) OR start_time BETWEEN timeFrom AND timeTo) -- start time
AND
(seconds IS NULL OR `time_diff` >= seconds) -- min time difference
AND
(alertStatus IS NULL OR `status` = alertStatus) -- status
AND
(jHostName IS NULL OR `host_name` = jHostName) -- host name
ORDER BY
alert_id DESC
LIMIT
_offsetVal, _fetchVal;
END
关于如果变量为空,MYSQL 忽略 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39448152/