簡體   English   中英

如何在SQLite觸發器中實現If語句?

[英]How can you implement an If statement in a SQLite trigger?

我們在SQLite數據庫中定義了一種自引用關系,如下所示...

Create Table Categories{
    Id INTEGER PRIMARY KEY,
    Name TEXT NOT NULL CHECK(length(Text) > 0),
    ParentId INTEGER References Categories(Id),
    IsSelected BOOL
};

我們正在嘗試在IsSelected字段上設置觸發器,以自動將值傳播到層次結構中。

將值設置為True時,這很容易。 我們只需將觸發器設置為將其父級設置為True,這又對其父級執行相同的操作,沿層次結構向上移動直到到達根。

但是,當我們將其設置為False時,該邏輯將不適用,因為可能會更改記錄的另一個同級,而該同級仍然為true,因此其父級仍然為true。

那么,如何在觸發器中執行以下操作? 請注意,這顯然是SQL,C#和LINQ的荒謬混合,但這說明了我正在嘗試做的事情。

CREATE TRIGGER T_Categories_IsSelectedChanged
UPDATE OF IsSelected ON Categories
BEGIN
    if(new.IsSelected)
        Update Categories Set IsSelected = True Where Id = old.ParentId;
    else
    {
        void isSiblingSelected = Categories
            .Where(c => c.ParentId = old.ParentId)
            .Any(c => c.IsSelected);

        UPDATE Categories 
        SET IsSelected = isSiblingSelected
        WHERE Id = old.ParentId;
    }
END

現在從技術上講,“ Else”子句在兩種情況下均適用。 If可能是短路,但也許我可以做這樣的事情...

Update Categories
SET IsSelected = (
    SELECT EXISTS(SELECT 1 FROM Categories
    WHERE IsSelected = True 
    AND ParentId = old.ParentId
    LIMIT 1))
Where ID = old.ParentId;

...但這只是一個猜測。 我在正確的軌道上嗎?

您可以參考http://www.sqlite.org/lang_expr.html#case

我不確定,但您的代碼可能像這樣,

CREATE TRIGGER T_Categories_IsSelectedChanged
UPDATE OF IsSelected ON Categories
BEGIN
case when new.isSelected then
    Update Categories Set IsSelected = True Where Id = old.ParentId;
else
    Update Categories Set IsSelected = Categories
        .Where(c => c.ParentId = old.ParentId)
        .Any(c => c.IsSelected);
END

CASE不是聲明; 您只能在表達式內使用它。

但是,觸發器具有WHEN子句 ,該子句采用任意SQL表達式:

CREATE TRIGGER T_Categories_IsSelectedChanged_true
AFTER UPDATE OF IsSelected ON Categories
FOR EACH ROW
WHEN new.IsSelected
BEGIN
    UPDATE Categories
    SET IsSelected = 1
    WHERE Id = old.ParentId;
END;

CREATE TRIGGER T_Categories_IsSelectedChanged_false
AFTER UPDATE OF IsSelected ON Categories
FOR EACH ROW
WHEN NOT new.IsSelected
BEGIN
    UPDATE Categories 
    SET IsSelected = (SELECT IFNULL(MAX(IsSelected), 0)
                      FROM Categories
                      WHERE ParentId = old.ParentId)
    WHERE Id = old.ParentId;
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM