MySql 存储过程 WHERE "variabilised" 根据参数

MySql Stored procedure WHERE "variabilised" according to a parameter

我对存储过程完全陌生,我想了解它的基本概念。这是我的第一个,当然有问题。

基本上查询将是相同的(原始的更复杂,还有其他操作)但是 WHERE 子句根据 selType 参数而变化。所以我想做的是根据参数值对 WHERE 子句的 "variabilisation" 进行排序。 我不知道这是否是正确的做法,如果是的话,它有什么问题。

DELIMITER //

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN)
BEGIN
DECLARE whereUserCriteria VARCHAR(127);
IF selType = 1 THEN
    SET whereUserCriteria = CONCAT('address_id = ', addressId);
ELSE
    SET whereUserCriteria = 'address_id = 1';
END IF;

SELECT whatever
FROM wherever AS ad
WHERE whereUserCriteria ;

END //

很高兴看到,当它未被变量化时,它可以完美地工作,但是,一旦我使用变量使其动态化,它就会停止工作。 当然,这只是一个示例,旨在了解在这种情况下最好的方法是什么。

您可能想要进行动态查询。

但是您可以像这样使用 CASE 重写示例(但不确定这是否是您想要的):

SELECT whatever
FROM wherever AS ad
WHERE address_id = CASE WHEN selType = 1 
                        THEN addressId
                        ELSE 1
                   END;

您可以准备将​​查询和条件连接在一起的查询,并使用 Prepared Execute 语句执行该查询,如下所示(如上面的评论中所述):

DELIMITER //

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN)
BEGIN
DECLARE whereUserCriteria VARCHAR(127);
IF selType = 1 THEN
    SET whereUserCriteria = CONCAT('address_id = ', addressId);
ELSE
    SET whereUserCriteria = 'address_id = 1';
END IF;

SET @myQuery = '';
SET @myQuery = CONCAT("SELECT whatever FROM wherever AS ad
WHERE ",whereUserCriteria,") ;
PREPARE stmQuery FROM @myQuery;
EXECUTE stmQuery;
DEALLOCATE PREPARE stmQuery;

END //

DELIMITER ;