我正在尝试通过存储过程填充一个表,如下所示:
SET @resultsCount = (SELECT COUNT(*) FROM tableA);
SET @i = 0;
WHILE @i < @resultscount DO
SET @revNum = 0;
INSERT INTO tableB (Name, revNumber, Meta)
SELECT
name AS Name,
(IF @i=0 THEN
SELECT @revNum;
ELSE IF <condition> THEN
SET @revNum = @revNum +1;
SELECT @revNum;
ELSE
SELECT @revNum;
END IF) AS revNumber,
meta AS Meta
FROM tableA;
SET @i = @i + 1;
END WHILE; 但是,上面的IF语句由于语法错误而失败。我尝试使用IF函数或case语句,但它们似乎只允许在每个条件之后执行一条语句,并且我需要在两个单独的语句中执行一个SET,然后执行一个SELECT。
发布于 2019-08-13 03:12:24
通过使用ELSE IF,您可以启动一个新的IF语句,该语句永远不会END IF (您只需END IF一次)。将其更改为ELSEIF
IF @i=0 THEN
SELECT @revNum;
ELSEIF <condition> THEN
SET @revNum = @revNum +1;
SELECT @revNum;
ELSE
SELECT @revNum;
END IF发布于 2019-08-13 03:16:20
您不能在查询中使用像IF THEN这样的过程性特性;相反,可以尝试使用等价的查询,比如IF(<condition>, <true case>, <false case>)或CASE WHEN <condition1> THEN <value1|expression1> WHEN <condition2> THEN <value2|expression2> ELSE <valueX|expressionX> END。
基本上,如果查询中有一个;,而不仅仅是字符串的一部分,那么就会出现问题。
在您的情况下,我会将所有这些转换为以下内容:
IF(@i=0, @revNum, IF(<condition>, @revNum := @revNum + 1, @revNum)) AS revNumber
或
@revNum = @revNum + IF(@i <> 0 AND <condition>,1,0) AS revNumber
第一个版本是一个更直接的翻译,但第二个版本可能更安全,因为你可能会有一些奇怪的行为,因为你在条件表达式中对@/session变量赋值不小心。
https://stackoverflow.com/questions/57466911
复制相似问题