【问题标题】:Using case-when statement in stored procedure Syntax在存储过程语法中使用 case-when 语句
【发布时间】:2019-07-23 04:51:45
【问题描述】:

IF....ELSE IF...ELSE 更改为SWITCH 之后。我收到错误代码:1064

而不是IF....ELSE IF...ELSE 语句为两个以上的条件执行不同的代码,而不是上面我更改为 SWITCH 语句根据不同的条件执行一个单独的操作,然后在SWITCH 条件之外执行break,而不是多次执行IF 条件。

尤其是CASE WHEN FeedFlagStatus == '5' THEN

错误代码:1064

您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 附近'= 5 THEN UPDATE feed_item_setting SET read_status = ReadStatus WHERE' 在第 23 行

DELIMITER @@;

CREATE 
    PROCEDURE `saveProfileSetting`(IN `UserId` BIGINT, IN `FeedFlagStatus` INT, IN `ReadStatus` INT, IN `WriteStatus` INT, IN `WriteCmtStatus` INT) 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    BEGIN
        DECLARE userid VARCHAR(255);
        DECLARE noOfHits INT(11);
        DECLARE noOfHits2 INT(11);
        DECLARE intCode INT(11);

        SET userid = UserId;

        SET noOfHits = ( SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId );
        SET noOfHits2 = ( SELECT COUNT(*) FROM `feed_item_setting` WHERE `user_id` = UserId );

            IF EXISTS (SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId ) THEN  
                BEGIN

                    CASE  
                        WHEN FeedFlagStatus == 5 THEN
                            UPDATE `feed_item_setting` SET `read_status` = ReadStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 6 THEN
                            UPDATE `feed_item_setting` SET `write_status` = WriteStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 7 THEN
                            UPDATE `feed_item_setting` SET `write_cmt_status` = WriteCmtStatus WHERE `user_id` = UserId;
                            SET intCode = FeedFlagStatus;
                    END CASE;
                END;            
            ELSE
                BEGIN
                    CASE  
                        WHEN FeedFlagStatus == 5 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `read_status`) VALUES (UserId, ReadStatus);
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 6 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_status`) VALUES (UserId, WriteStatus);
                            SET intCode = FeedFlagStatus;
                        WHEN FeedFlagStatus == 7 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_cmt_status`) VALUES (UserId, WriteCmtStatus);
                            SET intCode = FeedFlagStatus;
                    END CASE;
                END;
            END IF;



        SELECT userid, noOfHits, noOfHits2, intCode;
    END;

@@;  -- Altered delimiter terminated compound statement

DELIMITER ; -- restore delimiter to standard semicolon

【问题讨论】:

  • = 而不是双 ==?
  • 执行成功。我教它是一个赋值运算符=。它实际上是一个相等运算符@jarlh
  • SQL 和其他一些语言只有一个 = 用于比较和赋值。
  • @jarlh - 并不总是:SELECT @var := expression ... - 需要冒号来消除歧义。同时,SET @var ... 可以任意使用。

标签: sql stored-procedures syntax switch-statement mariadb


【解决方案1】:

自 70 年代初由 IBM 开发以来,它一直使用单个等号进行比较。它最初被命名为结构化英语查询语言,因此它旨在接近常规人类语言。

对会话变量的赋值由:= 表示,并且可以通过以下方式完成对变量的赋值

DECLARE locRecord VARCHAR(255);
SELECT * INTO locRecord FROM `location_map` WHERE `user_id` = UserId;

DELIMITER @@;

CREATE 
    PROCEDURE `saveProfileSetting`(IN `UserId` BIGINT, IN `FeedFlagStatus` INT, IN `ReadStatus` INT, IN `WriteStatus` INT, IN `WriteCmtStatus` INT) 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    BEGIN
        DECLARE userid VARCHAR(255);
        DECLARE noOfHits INT(11);
        DECLARE noOfHits2 INT(11);
        DECLARE intCode INT(11);

        SET userid = UserId;

        SET noOfHits = ( SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId );
        SET noOfHits2 = ( SELECT COUNT(*) FROM `feed_item_setting` WHERE `user_id` = UserId );
        -- IF ( SELECT count(*) FROM `group_users` WHERE `group_id` = groupId AND `userid` = userId AND `stataus` = 1 ) > 0 THEN


            IF EXISTS (SELECT `user_id` FROM `feed_item_setting` WHERE `user_id` = UserId ) THEN  
                BEGIN

                    CASE  
                        WHEN FeedFlagStatus = 5 THEN
                            UPDATE `feed_item_setting` SET `read_status` = ReadStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 6 THEN
                            UPDATE `feed_item_setting` SET `write_status` = WriteStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 7 THEN
                            UPDATE `feed_item_setting` SET `write_cmt_status` = WriteCmtStatus WHERE `user_id` = UserId;
                            SET intCode:= FeedFlagStatus;
                    END CASE;
                END;            
            ELSE
                BEGIN
                    CASE  
                        WHEN FeedFlagStatus = 5 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `read_status`) VALUES (UserId, ReadStatus);
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 6 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_status`) VALUES (UserId, WriteStatus);
                            SET intCode:= FeedFlagStatus;
                        WHEN FeedFlagStatus = 7 THEN
                            INSERT INTO `feed_item_setting` (`user_id`, `write_cmt_status`) VALUES (UserId, WriteCmtStatus);
                            SET intCode:= FeedFlagStatus;
                    END CASE;
                END;
            END IF;



        SELECT userid, noOfHits, noOfHits2, intCode;
    END;

@@;  -- Altered delimiter terminated compound statement

DELIMITER ; -- restore delimiter to standard semicolon

历史会重演,那些不注意和不学习的人注定会再次重演。不是很明显吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多