【问题标题】:MySQL IF THEN AS SyntaxMySQL IF THEN AS 语法
【发布时间】:2019-12-19 08:54:14
【问题描述】:

我正在尝试通过这样的存储过程填充表:

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。

【问题讨论】:

    标签: mysql if-statement stored-procedures while-loop alias


    【解决方案1】:

    通过使用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
    

    【讨论】:

      【解决方案2】:

      您不能在查询中使用像IF THEN 这样的程序功能;而是尝试查询等效项,例如 IF(&lt;condition&gt;, &lt;true case&gt;, &lt;false case&gt;)CASE WHEN &lt;condition1&gt; THEN &lt;value1|expression1&gt; WHEN &lt;condition2&gt; THEN &lt;value2|expression2&gt; ELSE &lt;valueX|expressionX&gt; END

      基本上,如果您在查询中有;,这不仅仅是字符串的一部分,那么就会出现问题。


      在你的情况下,我会将所有这些翻译成这样的:

      IF(@i=0, @revNum, IF(&lt;condition&gt;, @revNum := @revNum + 1, @revNum)) AS revNumber

      @revNum = @revNum + IF(@i &lt;&gt; 0 AND &lt;condition&gt;,1,0) AS revNumber

      第一个版本是更直接的翻译,但第二个版本可能更安全,因为如果你不小心在条件表达式中分配 @/session 变量,可能会出现一些奇怪的行为。

      【讨论】:

        猜你喜欢
        • 2015-08-20
        • 2011-11-15
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 2022-10-23
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多