SQL中的CASE-WHEN-THEN-ELSE构造

时间:2016-11-30 13:20:19

标签: mysql mariadb

我正在寻找一些带有IF-THEN-ELSE结构的SQL查询的帮助。 在“dump”-table中插入一个新行(取决于一列的值)后,它围绕我的应用程序中的自动化 - 复制到一个特殊的表。

为了练习它,我用表prob和表prob2

创建了一个测试DB

触发机制受到控制。 现在仍然是如何处理这个特殊规则。这取决于“c”

的值

用语言来说这就是我想要的:

IF ( the value in column c of the prob-table - from the row with the highest ID of the prob table = 2 )
THEN (Now, copy this line to the prob2 table)
END IF

这样我可以为“c”的每个值在IF-THEN - ELSEIF - THEN - ELSEIF - THEN - END IF构造中执行不同的动作。

表概率:

 - id   |      a        | b | c |
 -  ----+---------------+---+---+ 
 - 1    |std745_900w    | 5 | 4 |
 -  ----+---------------+---+---+ 
 - 2    |std745_900w    | 2 | 3 |
 -  ----+---------------+---+---+ 
 - 3    |std745_900w    | 1 | 9 |
 -  ----+---------------+---+---+ 
 - 4    |std745_900w    | 3 | 2 |
 -  ----+---------------+---+---+

我的转换为(不工作)SQL查询

IF
  (SELECT c  FROM prob WHERE id = (SELECT MAX(id) FROM prob ) = 2 )
THEN
  (INSERT INTO prob2 ( id, a, b, c )
   SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob) )
END IF

括号之间的IF之后的查询) - > SELECT c FROM prob WHERE id = (SELECT MAX(id) FROM prob)< - 工作正常,结果为“2” 在THEN之后的查询 - > INSERT INTO prob2 ( id, a, b, c ) SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob)< - 运作良好 但是,SQL不理解“IF语句”的表达。

这是MariaDB上的mysql

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

你可以使用

CASE WHEN (your_test) THEN (do_something_here) ELSE

你可以使用很多'当......然后'

答案 1 :(得分:0)

缺少一些细节,但您可以使用MySQL过程语言执行此操作并从触发器中调用它:

CREATE PROCEDURE COPY_ROW () 
    BEGIN
        DECLARE pId INT DEFAULT 0;
        DECLARE pC INT DEFAULT 0;

        SELECT id, c
        INTO pId, pC
        FROM prob 
        WHERE id = (SELECT MAX(id) FROM prob );

        IF(pC = 2) THEN
             INSERT INTO prob2 ( id, a, b, c )
             SELECT id, a, b, c FROM prob WHERE id = pId;

        END IF;
     END;

答案 2 :(得分:0)

SELECT @c := c FROM prob ORDER BY id DESC LIMIT 1;
IF @c = 2 THEN
    INSERT INTO prob2 (id, a, b, c)
         SELECT id, a, b, c FROM prob ORDER BY id DESC LIMIT 1;
END IF

你的括号出了问题。获取MAX(id)的子查询通常可以通过ORDER BY更好地完成。

答案 3 :(得分:0)

感谢大家的注意和提示。使用过程就是这个问题的答案。 谢谢大家!