我想创建一个触发器TR_rate,用于检查"功能"插入新行时的字段,并根据所包含的功能调整速率。
features字段可以包含多个值,我希望条件适用于每个值。因此,如果该字段包含' Feature1,Feature2',则费率应该上升35。
我目前的代码方法仅在有一个功能时才有效。如何重写它以适应多种功能?
CREATE OR REPLACE TRIGGER TR_rate
BEFORE INSERT
ON rates_table
FOR EACH ROW
BEGIN
IF(:NEW.features = 'Feature1') THEN
:NEW.rate := (:NEW.rate + 15);
IF(:NEW.features = 'Feature2') THEN
:NEW.rate := (:NEW.rate + 20);
IF(:NEW.features = 'Feature3') THEN
:NEW.rate := (:NEW.rate + 30);
END IF;
END IF;
END IF;
END;
/
答案 0 :(得分:2)
您需要if
语句是顺序的而不是嵌套的,以及使用like
:
IF(:NEW.features like '%Feature1%') THEN
:NEW.rate := (:NEW.rate + 15);
END IF;
IF(:NEW.features like '%Feature2%') THEN
:NEW.rate := (:NEW.rate + 20);
END IF;
IF(:NEW.features like '%Feature3%') THEN
:NEW.rate := (:NEW.rate + 30);
END IF;
但是,我只想使用select
:
select (new.rate +
(case when :new.features like '%Feature1%' then 15 else 0 end) +
(case when :new.features like '%Feature2%' then 20 else 0 end) +
(case when :new.features like '%Feature3%' then 30 else 0 end)
)
into :new.rate;
您可以在PL / SQL级别执行相同的操作,但这会在单个语句中捕获逻辑。
答案 1 :(得分:1)
重复所有三个:
IF(:NEW.features like '%Feature1%') THEN