SQL中的多个SET语句使用CASE触发?

时间:2015-12-30 20:58:56

标签: mysql sql triggers

我的SQL数据库中有一个表,其中包含一个名为“event_attributes”的列。它是一个字符串,每个单元格都包含这样的内容:

a:4{s:10:"Discipline";s:7:"Running";s:5:"Level";s:3:"All";s:10:"Instructor";s:13:"Bill Jones";s:3:"Free";s:2:"No";}

我正在尝试创建一个触发器,将其分解为几个看起来像

的新列
Disciple |  Level |  Instructor  |   Free
-----------------------------------------
Running  |  All   |  Bill Jones  |   No

使用下面的代码,我可以让它适用于一套声明。

 DROP TRIGGER IF EXISTS `recode`;
 CREATE TRIGGER `recode` 
 BEFORE INSERT ON `wp_em_events` 
 FOR EACH ROW 
 SET NEW.discipline = CASE 
 WHEN NEW.event_attributes LIKE '%Boxing%' THEN 'Boxing' 
 WHEN NEW.event_attributes LIKE '%Climbing%' THEN 'Climbing' 
 WHEN NEW.event_attributes LIKE '%Cycling%' THEN 'Cycling'
 WHEN NEW.event_attributes LIKE '%Yoga%' THEN 'Yoga'   
 ELSE NEW.discipline = NULL 
 END 

但是,如果我添加如下内容:

 SET NEW.level = CASE

 WHEN NEW.event_attributes LIKE '%All%' THEN 'All'

 ....

我收到一条消息,说我的SQL语法有错误。任何人都知道如何将两个或多个SET语句嵌套到一个触发器中?对不起,如果这是一个愚蠢的问题 - 新的。

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该使用逗号列出多个字段。这是一个简洁的例子:

create trigger test before insert on sometable
for each row 
set NEW.field2 = case when New.field1 = 1 then 2 else 0 end, 
    NEW.field3 = case when New.field1 = 1 then 3 else 0 end;

顺便说一句,虽然您的else声明在技术上有效,但您基本上设置了NEW.discipline = NEW.discipline = NULL。使用else null读得更好。