Android SQLite,如何在UPDATE中使用CASE语句?

问题描述 投票:0回答:1

我有一张学生桌:

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
android sql sqlite android-sqlite
1个回答
0
投票

您应该使用此结构重写代码,您应该在 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;
© www.soinside.com 2019 - 2024. All rights reserved.