具有IF比较的Oracle SQL触发器

时间:2014-05-23 17:15:56

标签: sql oracle

我想创建一个触发器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;
/

2 个答案:

答案 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