2015-12-30 28 views
1

我在我的SQL数据库中有一个表,其中包含一个名为'event_attributes'的列。这是一个字符串,每个单元拥有这样的事情:使用CASE的SQL触发器中的多个SET语句?

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语句嵌套到一个触发器中?对不起,如果这是一个愚蠢的问题 - 在这个新的。

谢谢!

+0

而不是增加额外的'set'语句,我认为你应该使用逗号 - 'set new.field = blah,new.field2 = blah2' ... – sgeddes

+0

这条线有问题。 'ELSE NEW.discipline = NULL',它应该是'ELSE NULL',或者如果所有条件都失败,你可以省略'ELSE'部分作为缺省值'null' –

回答

1

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

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读得好一点。

+0

谢谢大家!是的,那个逗号就是这样做的。另一个问题是我添加了另一个“SET”,所以它看起来像SET NEW.field1 ....,SET NEW.field2 .....添加了逗号,删除了第二个“SET”并且它可以工作!我也将ELSE NEW.field = NULL更改为ELSE NULL。感谢帮助! –