Mysql 将查询编辑到存储过程中

Mysql 将查询编辑到存储过程中,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我要在MySQL中调用一个存储过程,它接收3个参数。它们中的任何一个都可以为null。现在,如果它们为空,我必须运行一个没有where语句的开放查询,如果它们不是空的,我必须对收到的值应用约束。我在这里给你我的密码 DELIMITER ;; CREATE PROCEDURE `getPeople`( IN p_startDate DATE, IN p_endDate DATE, IN p_name TEXT ) BEGIN SELECT * FROM people; -- if

我要在MySQL中调用一个存储过程,它接收3个参数。它们中的任何一个都可以为null。现在,如果它们为空,我必须运行一个没有where语句的开放查询,如果它们不是空的,我必须对收到的值应用约束。我在这里给你我的密码

DELIMITER ;;
CREATE PROCEDURE `getPeople`(
IN p_startDate DATE,
IN p_endDate DATE,
IN p_name TEXT
)
BEGIN
    SELECT * FROM people;
    -- if p_startDate is not null, 'append' to the query "WHERE birthdate >= p_startDate"
    -- if p_endDate is not null, 'append' to the query "WHERE birthdate <= p_endDate"
    -- if p_name is not null, 'append' to the query "WHERE name = p_name"
END;;
DELIMITER ;
我的第一种方法是编写3个不同的查询,但我不能将它们混合在一起,例如:p_startDate和p_endDate not null,我只希望执行1个查询。你能给我照点光吗


非常感谢。

我相信在MySQL中,预先准备好的语句是实现这一点的方法。您可以使用动态SQL在SQL server中实现这一点

请看这里:

您可以将没有where子句的主语句放入一个变量中,然后使用所需的任何逻辑将where子句附加到该字符串中,然后准备并执行该字符串中的查询


上面的页面给出了一些示例,您应该能够根据自己的需要进行调整。

这非常完美。使用SET和CONCAT,我可以附加where限制