我有一张学生桌:
CREATE TABLE students (name TEXT, grade INTEGER, level TEXT);
我使用此代码插入一个条目:
INSERT INTO students(name, grade) VALUES('Allen', 80);
除了级别值为 NULL 之外,效果很好,所以我在此表上添加一个触发器,该触发器将根据成绩更新级别。
CREATE TRIGGER student_insert_trigger
AFTER INSERT ON students
BEGIN
CASE
WHEN NEW.gradle > 80 THEN
UPDATE students SET level = 'A' WHERE name = NEW.name;
WHEN NEW.gradle < 60 THEN
UPDATE students SET level = 'C' WHERE name = NEW.name;
ELSE
UPDATE students SET level = 'B' WHERE name = NEW.name;
END
END
但是这个sql代码似乎是错误的:
near "CASE": syntax error
,我尝试过IF语句并得到错误ethier。
那么这样的函数触发器如何实现呢?
我得到了关于修改SQL语句的答案,在这种情况下效果很好。但这个问题是基于我的工作的一个简单的例子,在我的工作中问题要复杂得多,不能通过修改SQL语句来解决。
我需要做的有点像编程语言中的if else语句,我在网上找了很多资料,但是所有的例子都是在
CASE THEN
或SELECT
中使用UPDATE
。
我确实需要在
UPDATE
中使用DELETE
或CASE THEN ELSE
(在THEN
之后),但我不确定SQL是否允许这样做。我们举个简单的例子,如何实现这个SQL:
CREATE TRIGGER student_insert_trigger
AFTER INSERT ON students
BEGIN
CASE
WHEN NEW.gradle > 80 THEN
UPDATE students SET level = 'A' WHERE name = NEW.name;
WHEN NEW.gradle < 60 THEN
DELETE FROM students WHERE name = NEW.name;
ELSE
UPDATE students SET grade = 70 WHERE name = NEW.name;
END
END
您应该使用此结构重写代码,您应该在 BEGIN ... END 块中使用 WHEN 子句,而不是 CASE 语句。以下是修改触发器的方法:
CREATE TRIGGER student_insert_trigger
AFTER INSERT ON students
FOR EACH ROW -- Note the addition of FOR EACH ROW
BEGIN
UPDATE students
SET level =
CASE
WHEN NEW.grade > 80 THEN 'A'
WHEN NEW.grade < 60 THEN 'C'
ELSE 'B'
END
WHERE name = NEW.name;
END;