Mysql基于逻辑在存储过程中动态构建查询字符串

Posted

技术标签:

【中文标题】Mysql基于逻辑在存储过程中动态构建查询字符串【英文标题】:Mysql dynamically build query string in a stored procedure based on logic 【发布时间】:2012-01-22 21:24:25 【问题描述】:

目标是根据输入变量更改 mysql 存储过程中的查询字符串。

类似这样的:

CREATE DEFINER=`root`@`localhost` PROCEDURE `func`(type VARCHAR(15))
BEGIN
    SET @type = type;

    -- Check for the sort parameter
    if @type="asc" THEN
        SET @sort = " order by name asc";
    elseif @type="desc" THEN
        SET @sort = " order by name desc";
    else
        SET @sort ="";
    end if;

SELECT id, name from table @sort;

END    

【问题讨论】:

解决方法是使用execute,concat:CREATE DEFINER=root@localhost PROCEDURE test(input VARCHAR(15)) BEGIN SET @input = input; if @input="asc" 然后 SET @sort = " order by ActivityLogKey asc"; elseif @input = "desc" 然后 SET @sort = "order by ActivityLogKey desc";否则 SET @sort ="";万一; SET @query = CONCAT('select * from activitylog',@sort,'limit 0, 5');准备来自@query的stmt;执行语句; DEALLOCATE PREPARE stmt;结束 如果这是您没有将其添加为答案并接受它或用它编辑您的问题的解决方案。 没有100名声望,我要等8个小时才能回答我自己的问题 @BenGuthrie:然后等等。限制没有到位,因为开发人员希望您将答案发布在错误的位置;之所以实施,是因为他们希望您等待。这是有原因的。 @TomalakGeret'kal 好建议。谢谢。 【参考方案1】:

解决方法是使用execute,concat:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(input VARCHAR(15))
BEGIN
SET @input = input;

if @input="asc" then
    SET @sort = " order by ActivityLogKey asc";
elseif @input = "desc" then
    SET @sort = " order by ActivityLogKey desc";
else
    SET @sort ="";
end if;

SET @query = CONCAT('select * from activitylog ',@sort,' limit 0, 5');

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

【讨论】:

我发现这样做的用处是能够有条件地插入连接、字段或任何其他 SQL 代码作为存储过程的一部分,而不是在 php 中。在存储过程级别实现这一点似乎要干净得多。 顺便说一句,即使没有定义存储过程,execute 和 concat 也是解决方案; “但如果你不改变......实现一个准备好的语句来生成动态 SQL”下的一个很好的例子。在Taryn's answer here。我发现这对于“一次性”(一次性)查询很有用。

以上是关于Mysql基于逻辑在存储过程中动态构建查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程

在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果

存储过程中的mysql动态查询

存储过程中的动态MYSQL查询

事务、存储过程和 PDO

如何在 MySQL 存储过程中使用动态 SQL