MySQL: сохранить оператор условия запроса процедуры в качестве параметра - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю 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.

1 Ответ

1 голос
/ 20 апреля 2020

Оператор сравнения не может быть вставлен в запрос таким способом. Вы должны использовать либо подготовленную выписку, либо CASE.

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