【问题标题】:MySQL: store procedure query condition operator as parameterMySQL:存储过程查询条件运算符作为参数
【发布时间】:2020-08-02 19:18:13
【问题描述】:

我正在创建一个Stored Procedure,用于删除位于多个表中的父记录及其子记录。但是,要执行的查询只有 3 种类型,例如:=>>=

DELIMITER $$

DROP PROCEDURE IF EXISTS `removeStory` $$

CREATE PROCEDURE `removeStory`(IN _id INTEGER, IN _cond VARCHAR(1))
    BEGIN
        # checking condition
        IF ISNULL(_cond) AND (_cond = '=') OR (_cond = '>') OR (_cond = '>=') THEN 
            # removing `comment -> replies`
            DELETE FROM `comment_replies`
            INNER JOIN `comments` ON `comment_replies`.`comment_id` = `comments`.`id`
            WHERE `comments`.`story_id` _cond _id;

            # removing `comments`
            DELETE FROM `comments`
            WHERE `story_id` _cond _id;

            ...

            ...

            # removing `story`
            DELETE FROM `stories`
            WHERE `id` _cond _id;
        END If;
    END$$
DELIMITER ;

CALL removeStory(10, '>=');

我在_condition 变量中传递查询操作,但它给了我语法错误。另外,有什么办法可以减少OR 条件。

【问题讨论】:

  • 我会将所有 OR 括起来
  • 好的,但你能说得更具体一点吗,怎么样..?
  • IF ISNULL(_cond) AND ((_cond = '=') OR (_cond = '>') OR (_cond = '>=')) THEN
  • 对不起,@P.Salmon,当我要求减少 _cond 条件时,这不是我的想法。我真正的意思是类似于in_array in php

标签: mysql stored-procedures syntax conditional-statements


【解决方案1】:

比较运算符不能通过这种方式插入到查询中。您必须使用准备好的语句或 CASE。

...
WHERE CASE _cond WHEN '>'  THEN id >  _id
                 WHEN '<'  THEN id >  _id
                 WHEN '!=' THEN id != _id 
                 ...
                 WHEN '<>' THEN id <> _id 
                 END, 
...

【讨论】:

  • 感谢@Akina 提供的信息。我想,在这种情况下,原始查询比存储过程更好:)
猜你喜欢
  • 2013-10-10
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多