这是一个存储过程,有3种可能的情况。我不知道如何使第三种情况下运行。如果我交换2和3,则3可以正常运行,而2则不能运行,这使我相信这不是每种情况下的实际代码。
CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
BEGIN
CASE WHEN _userType = 1
THEN
*do stuff that works*
WHEN '2'
THEN
*do other stuff that works*
WHEN '3'
THEN
{this won't run, but does if I swap it out with 2}
ELSE BEGIN END;
END CASE;
END;
它不会给出错误,但是无论哪个代码位于3个位置的最后一个位置,它都不会执行任何操作(例如,将“ WHEN'3'”移到WHEN'2'的位置)是,然后2不会运行或出错)。
答案 0 :(得分:1)
您将on the MySQL documentation中描述的两种可能的CASE WHEN
语法混合在一起。您可以仅在CASE
上使用变量来使用以下解决方案:
CREATE DEFINER = `user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType INT, IN _clientId VARCHAR(45), IN _username VARCHAR(50))
BEGIN
CASE _userType
WHEN 1 THEN
-- do something
WHEN 2 THEN
-- do something
WHEN 3 THEN
-- do something
ELSE
BEGIN END;
END CASE;
END;
...或以下在每个WHEN
上使用变量的解决方案(而不是在CASE
上使用一次):
CREATE DEFINER = `user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType INT, IN _clientId VARCHAR(45), IN _username VARCHAR(50))
BEGIN
CASE
WHEN _userType = 1 THEN
-- do something
WHEN _userType = 2 THEN
-- do something
WHEN _userType = 3 THEN
-- do something
ELSE
BEGIN END;
END CASE;
END;
答案 1 :(得分:1)
使用完整的表达式:
CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
BEGIN
CASE WHEN _userType = 1
THEN
*do stuff that works*
WHEN _userType = '2'
THEN
*do other stuff that works*
WHEN _userType = '3'
THEN
*do other stuff that works*
ELSE BEGIN END;
END CASE;
END;
旁注:由于MYSQL中的'2'和'3'计算为TRUE,因此发生了您的情况。
答案 2 :(得分:1)
我只能说我能看到的代码,不是我看不到的代码,但是我发现您的代码有一些潜在的问题。首先,CASE
表达式的每个谓词都应以定界符结尾。另外,如果您没有ELSE
条件,则不要包含条件。所以我推荐这个版本:
CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
BEGIN
CASE _userType WHEN 1
THEN *do stuff that works*;
WHEN 2
THEN *do other stuff that works*;
WHEN 3
THEN {this won't run, but does if I swap it out with 2};
END CASE;
END;