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 = null
和 not (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
值,您想插入什么?
我正在编写触发器,如果 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 = null
和 not (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
值,您想插入什么?