TRIGGER 中的 SELECT CASE 语句

Posted

技术标签:

【中文标题】TRIGGER 中的 SELECT CASE 语句【英文标题】:SELECT CASE statement in TRIGGER 【发布时间】:2012-05-07 22:12:58 【问题描述】:

我有一个运行正常的“SELECT CASE”语句查询:

SELECT 
(CASE `t`.`is_combined` 
WHEN 0 
THEN `t`.`topic_id` 
ELSE `t`.`is_combined` 
END) AS`group_id`,
    SUM(`ctt`.`tm_download_status`) AS `is_downloaded`, 
    COUNT(`t`.`topic_id`) AS `group_topics_cnt`,
    (SUM(`ctt`.`tm_download_status`) = COUNT(`t`.`topic_id`)) AS `is_downloaded_group` 
    FROM (`catalog_topics` `t` LEFT JOIN `catalog_tracker_torrents` `ctt` ON((`ctt`.`topic_id` = `t`.`topic_id`))) 
    WHERE (`t`.`topic_id` != 0) 
    GROUP BY (`group_id`)

所以,我想创建一个类似的触发器来更新“交叉”表:

DELIMITER $$ 
CREATE TRIGGER `tdg_ins_by_topics` AFTER INSERT ON `catalog_topics` FOR EACH ROW 
BEGIN
REPLACE INTO catalog_topics_downloaded_groups(
      SELECT (
              CASE `t`.`is_combined`
              WHEN 0
              THEN `t`.`topic_id`
              ELSE `t`.`is_combined`
              END
     ) AS `group_id` , 
SUM( `ctt`.`tm_download_status` ) AS `is_downloaded` , 
COUNT( `t`.`topic_id` ) AS `group_topics_cnt` , (
SUM( `ctt`.`tm_download_status` ) = COUNT( `t`.`topic_id` ) ) AS `is_downloaded_group`
FROM `catalog_topics` `t`
LEFT JOIN `catalog_tracker_torrents` `ctt` ON `ctt`.`topic_id` = `t`.`topic_id`
WHERE `t`.`topic_id`
IN (
NEW.`topic_id`
)
GROUP BY `group_id`
)
END ;
$$

但收到错误消息:

"#"1064 - 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册以获取正确的语法使用 在第 14 行的“END”附近

看起来 MySQL 不理解 TRIGGER 语句中的 CASESELECT 语句中的 CASE 之间的区别。那么,我该如何解决这个问题?

感谢您的回答。

【问题讨论】:

我修正了一个语法错误。关于第 14 行 - 它是第一个 END,我忘记了 phpMyAdmin 在制表符和字符串换行之后发送查询。真丢人。 【参考方案1】:

我认为你需要用;“结束”你的REPLACE语句,就像你必须用分隔符结束TRIGGERPROCEDURE/FUNCTION内的所有语句一样。

这就是为什么您将 DELIMETER 更改为 $$ .. 这样您就可以使用 ; 将 mysql 默认分隔符存储在触发代码中。 (并以更改后的$$ 分隔符结束创建触发器语句)

DELIMITER $$ 
CREATE TRIGGER `tdg_ins_by_topics` AFTER INSERT ON `catalog_topics` FOR EACH ROW 
BEGIN
    REPLACE INTO catalog_topics_downloaded_groups(
          SELECT ( CASE `t`.`is_combined`
                   WHEN 0
                   THEN `t`.`topic_id`
                   ELSE `t`.`is_combined`
                   END
                 ) AS `group_id`, 
                 SUM(`ctt`.`tm_download_status`) AS `is_downloaded`, 
                 COUNT( `t`.`topic_id` ) AS `group_topics_cnt` , 
                 (
                 SUM( `ctt`.`tm_download_status` ) = COUNT( `t`.`topic_id` ) ) AS `is_downloaded_group`
          FROM `catalog_topics` `t`
          LEFT JOIN `catalog_tracker_torrents` `ctt` ON `ctt`.`topic_id` = `t`.`topic_id`
          WHERE `t`.`topic_id` IN ( NEW.`topic_id` )
          GROUP BY `group_id`
    );
END;
$$
DELIMETER ;

【讨论】:

以上是关于TRIGGER 中的 SELECT CASE 语句的主要内容,如果未能解决你的问题,请参考以下文章

Informix 是不是支持 SELECT 查询中的 CASE 语句

Select 语句中的 Case 语句中的 Exists 函数需要 FOREVER

在case语句中使用select语句中的参数[重复]

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

SQL查询语句SELECT中带有case when嵌套子查询判断的问题

Go_select