【问题标题】:how to use if statement in sqlite如何在sqlite中使用if语句
【发布时间】:2014-01-01 17:24:46
【问题描述】:

我在 SQL Server 中有这样的查询:

create trigger MyTrigger after updated on Customer
begin
declare @oldname nvarchar(50);

set @oldname = select d.CustomerName from deleted d
if(@oldname = 'John')
begin
      insert into tbl1(Name) values('John') -- An Insert For Example
end

end

old.CustomerName 将在 SQLite 中给我@oldname 值;

我将为 SQLite 做类似上面的东西;但我对 if 语句有疑问

我如何在 SQLite 中使用 select case then 来做类似的事情?还是我必须使用其他方式?

【问题讨论】:

    标签: sqlite tsql


    【解决方案1】:

    SQLite 触发器语法非常与 SQL Server 的不同。最简单的方法是使用WHEN 子句来限定触发器。 (由于这是一个删除触发器,我们使用OLD 来“访问已删除的行”。)

    CREATE TRIGGER myTrigger AFTER DELETE ON Customer
        WHEN OLD.CustomerName = 'John'
    BEGIN
        INSERT INTO tbl1(Name) VALUES ( OLD.CustomerName );
    END
    

    但是,这对于本案来说非常具体!一种更通用的方法是通过将事物从 SELECT 拉到 INSERT 来更多地使用关系代数的魔力,这会在条件失败时生成要插入的空行集合:

    CREATE TRIGGER myTrigger AFTER DELETE ON Customer
    BEGIN
        INSERT INTO tbl1(Name)
            SELECT OLD.CustomerName AS Name
                 WHERE OLD.CustomerName = 'John';
    END
    

    【讨论】:

    • 另一种方法是创建一个捕获到宿主进程的函数,并在那里使用自定义代码来处理事情。这是非常强大的,因为它几乎可以做任何事情,但对于这样的问题来说太过分了。
    • 嗨@Donal Fellows;感谢您的解决方案,它工作正常;我可以在一个触发器中有两个或多个条件吗?我的意思是在 tbl2 表上插入 CustomerName = 'John' 和 CustomerFamily = '....' 时的更新
    • @mohammadjannesary 我认为如果他们在不同的表上触发,他们需要是不同的触发器。如果它们在同一个表上触发,则可以使用复杂条件。
    猜你喜欢
    • 2011-10-21
    • 2017-08-30
    • 1970-01-01
    • 2016-09-18
    • 2015-01-26
    • 2021-05-29
    • 2020-06-23
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多