Mysql 动态查询where子句检查
这是我的Mysql 动态查询where子句检查,mysql,sql,Mysql,Sql,这是我的MySQL过程 DELIMITER $$ DROP PROCEDURE IF EXISTS `awaredb2`.`GetAlertList`$$ CREATE DEFINER=`aware`@`%` PROCEDURE `GetAlertList`(IN deviceIds VARCHAR(200), IN appIds VARCHAR(30000)) BEGIN SET @QUERY = ' SELECT P.policy_id AS PolicyId,
MySQL
过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `awaredb2`.`GetAlertList`$$
CREATE DEFINER=`aware`@`%` PROCEDURE `GetAlertList`(IN deviceIds VARCHAR(200), IN appIds VARCHAR(30000))
BEGIN
SET @QUERY = ' SELECT P.policy_id AS PolicyId,
P.name AS PolicyName,
(MAX(A.alert_create_date)) AS AlertCreateDate, ';
IF deviceIds != ''
THEN
SET @QUERY = CONCAT(@QUERY, ' SUM(AR.penalty) AS Penalty, ');
ELSE
SET @QUERY = CONCAT(@QUERY, ' '''' AS Penalty, ');
END IF;
SET @QUERY = CONCAT(@QUERY,' A.device_id AS DeviceId
FROM alert A
JOIN alert_rule AR ON AR.alert_id = A.id
JOIN policy P ON P.id = A.policy_id
JOIN device D ON D.id = A.device_id
WHERE P.name != '''' ');
IF deviceIds != ''
THEN
SET @QUERY = CONCAT(@QUERY, ' AND A.device_id IN(', deviceIds, ') ');
END IF;
--
IF appIds != ''
THEN
SET @QUERY = CONCAT(@QUERY, ' AND A.app_id IN(', appIds, ') ');
END IF;
SET @QUERY = CONCAT(@QUERY, ' GROUP BY P.name
ORDER BY AlertCreateDate DESC ');
PREPARE stmt FROM @QUERY;
EXECUTE stmt;
SELECT @QUERY;
END$$
DELIMITER ;
此过程接受两个参数。若参数值不是空的,那个么将使用该值来准备sql语句并最终执行
现在我被要求删除第一个默认条件p.name!=''代码>。如果每次都删除此条件,则必须检查是否存在其他两个参数。如果存在,则添加where子句。如果两者都存在,则在第二次检查之前添加和
,否则在where子句之后添加
稍后,此过程可能有两个以上的参数。因此,使用WHERE
和和管理此动态查询的最佳方法是什么?最简单的解决方案就是在查询中保留其中1=1
。优化器将消除它,您所要做的就是添加和…
块
另见第8.2.1.2节:
对始终为真的条件进行转换,例如:
WHERE 0=0 AND column1='y'
在这种情况下,第一个条件被删除,留下
WHERE column1='y'
如果有数百万条记录,该检查是否会影响程序性能?