如果为null,则在oracle insert语句中为空

时间:2016-04-19 08:43:44

标签: oracle triggers sql-insert isnull is-empty

我正在编写触发器,如果​​track表中的值发生变化,我必须在parent_key表中插入值。我必须检查值是否为null然后将其设置为空,否则旧值和我必须为新值做同样的事情。我尝试了以下case语句,但如果初始旧/新值为null,则不会插入到track表中。

create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key
  FOR EACH ROW

BEGIN

IF NOT  :old.track_name=:new.track_name THEN
    INSERT INTO track  (TRACK_OLD_VALUE,TRACK_NEW_VALUE)
    VALUES (case when :old.track_name is null then '' else to_char(:old.track_name) end,case when :new.track_name is null then '' else to_char(:new.track_name) end);
  END IF;

END;

2 个答案:

答案 0 :(得分:2)

在oracle中,空字符串''null完全相同。

您可以将IF更改为以下内容:

IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN

由于您无法比较null = null

答案 1 :(得分:1)

null = nullnot (null = null)结果的比较结果为false,您可以通过此声明看到

select case
         when null = null then
          'eq'
         when not (null = null) then
          'not eq'
         else
          '?'
       end
  from dual;
--> '?'

因此,您应该按null运算符比较is

IF :old.track_name <> :new.track_name 
 OR :old.track_name is null and :new.track_name is not null 
 OR :old.track_name is not null and :new.track_name is null THEN    

案例陈述case when :old.track_name is null then '' else to_char(:old.track_name) end是不必要的,因为null''是相同的。如果null值,您想要插入什么?