gpt4 book ai didi

mysql - 动态查询 where 子句检查

转载 作者:行者123 更新时间:2023-11-29 03:04:42 24 4
gpt4 key购买 nike

这是我的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 子句。如果两者都存在,则在第二次检查之前添加 AND,否则将其添加到 where 子句之后。

以后这个过程可能会有两个以上的参数。那么,使用 WHEREAND 管理此动态查询的最佳方式是什么?

最佳答案

最简单的解决方案就是在您的查询中保留一个WHERE 1=1。优化器将摆脱它,您所要做的就是添加 AND ... block 。

另见 http://dev.mysql.com/doc/internals/en/optimizer-primary-optimizations.html , 第 8.2.1.2 节:

A transformation takes place for conditions that are always true, for example:

WHERE 0=0 AND column1='y'

In this case, the first condition is removed, leaving

WHERE column1='y'

关于mysql - 动态查询 where 子句检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17672703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com