case when null then empty in oracle insert 语句

case when null then empty in oracle insert statement

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

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;

在oracle中,一个空字符串''null完全一样。

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

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

因为你无法比较null = null

null = nullnot (null = null) 的比较结果都是假的,正如你从这个语句中看到的那样

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

因此您应该通过 is 运算符比较 null 值,在您的情况下

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语句case when :old.track_name is null then '' else to_char(:old.track_name) end是不必要的,因为null''是一样的。如果 null 值,您想插入什么?