我的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语句嵌套到一个触发器中?对不起,如果这是一个愚蠢的问题 - 新的。
谢谢!
答案 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
读得更好。