如果变量为空,MYSQL 忽略 where 子句

标签 mysql stored-procedures where-clause

我有一个存储过程,它接收 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/

相关文章:

php - PHP 表中 undefined offset

mysql - 在 Symfony 2.5 和 Doctrine 查询生成器中使用圆括号 ( > )

MySQL执行时间黑魔法

mysql - 选择除 A 或 B 之外的记录

mysql - 如何获取另一列具有最大值的行中的列的值?

php - mysql语法问题

sql - 即席查询 vs 存储过程 vs 动态 SQL

sql-server-2008 - JPA 2.0 是否支持 SQL Server 表变量?

sql - 从 SQL 存储过程创建/更改

mysql - 使用 LIKE 子句搜索多列值