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 ;
我对存储过程完全陌生,我想了解它的基本概念。这是我的第一个,当然有问题。
基本上查询将是相同的(原始的更复杂,还有其他操作)但是 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 ;