需要什么代码才能有条件地为 beforeinsert 触发器中的字段提供值?

What code is needed to conditionally provide a value to a field in a beforeinsert trigger?

我需要在 table 的字段中存储字符串值,特别是在其 Subcategory VarChar(50) 列中。

在此 post 处理之前 Subcategory 的值是 0 或 1;我需要将其更改为更人性化的值。

我已经几十年没有创建数据库触发器了,需要一些代码方面的帮助。这是我的伪 SQL(SQL 和 VB 的大杂烩):

CREATE OR REPLACE TRIGGER tr_CustomerCategoryLog_BeforeInsert
BEFORE INSERT ON CustomerCategoryLog FOR EACH ROW

DECLARE _Category = :new.Category;
DECLARE _Subcategory = :new.Subcategory;

BEGIN
    If _Category = "New"
       If _Subcategory = 0
          :new.Subcategory := 'New';
       End If
       Else If _Subcategory = 1
           :new.Subcategory := 'Assumed';
        End If    
    End If

    If _Category = "Existing"
            If _Subcategory = 0
              :new.Subcategory := 'Existing';
            End If
            Else If _Subcategory = 1
                :new.Subcategory := 'Organic'
            End If    
        End If
        Return "Unknown"
        End Function        
  END;

如果逻辑不清楚,半通俗的英语是:

如果Category字段的值为"New",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"New";否则,将其设置为 "Assumed"

如果Category字段的值为"Existing",如果Subcategory的值当前为0,则将Subcategory字段的值也设置为"Existing";否则,将其设置为 "Organic"

也许我需要听听 Steely Dan 的专辑 "Trigger Logic"。

更新

我认为答案可行,但对我来说还不够完整。

因为我显然在上面的伪 SQL 中混淆了 Oracle 代码,完整的代码需要是什么样的(在 CustomerCategoryLog table 上创建一个 BeforeInsert 触发器)?

这样更像吗:

CREATE TRIGGER tr_CustomerCategoryLog_BeforeInsert
ON CustomerCategoryLog
INSTEAD OF INSERT
AS
BEGIN
    SELECT
        CASE
           WHEN @Category = 'New'      
              THEN CHOOSE(@Subcategory + 1, 'New', 'Assumed')
           WHEN @Category = 'Existing' 
              THEN CHOOSE(@Subcategory + 1, 'Existing', 'Organic')
           ELSE 'Unknown' 
        END
END

?

我倾向于避免触发(也许是性格缺陷......我也不喜欢土豆泥),但下面的插图可以简化你的逻辑

Declare @Category varchar(50) = 'Existing'
Declare @Subcategory int      = 1            -- works if BIT

Select case when @Category = 'New'      then choose(@Subcategory+1,'New','Assumed')
            when @Category = 'Existing' then choose(@Subcategory+1,'Existing','Organic')
            else 'Unknown' end

Returns

Organic