在oracle insert语句中为null然后为空的情况
我正在编写触发器,如果在oracle insert语句中为null然后为空的情况,oracle,triggers,sql-insert,isnull,is-empty,Oracle,Triggers,Sql Insert,Isnull,Is Empty,我正在编写触发器,如果parent\u key表中的值发生变化,我必须将值插入track表中。我必须检查该值是否为空,然后将其设置为空,否则将使用旧值,对于新值我必须执行相同的操作。我尝试了下面的case语句,但如果初始旧/新值为null,它不会插入到跟踪表中 create or replace TRIGGER parent_key_trg AFTER UPDATE ON parent_key FOR EACH ROW BEGIN IF NOT :old.track_name=:new
parent\u key
表中的值发生变化,我必须将值插入track
表中。我必须检查该值是否为空,然后将其设置为空,否则将使用旧值,对于新值我必须执行相同的操作。我尝试了下面的case语句,但如果初始旧/新值为null,它不会插入到跟踪表中
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 Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN
如果Nvl(:old.track_name,'NULL')Nvl(:new.track_name,'NULL'),则
由于无法在oracle中比较null=null
,因此空字符串'
与null
完全相同
如果
,您可以将更改为以下内容:
IF Nvl(:old.track_name, 'NULL') <> Nvl(:new.track_name, 'NULL') THEN
如果Nvl(:old.track_name,'NULL')Nvl(:new.track_name,'NULL'),则
由于您无法比较null=null
因此null=null
和not(null=null)
的比较结果为false,正如您可以从该语句中看到的那样
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
IF:old.track\u name:new.track\u name
或者:old.track\u name为null,而:new.track\u name不为null
或者:old.track\u name不为null,而:new.track\u name则为null
case语句case当:old.track\u name为null时,则不需要使用“else to\u char(:old.track\u name)end
,因为null
和'
是相同的。如果null
值为空,您希望插入什么 对null=null
和not(null=null)
的比较结果为false,正如您可以从该语句中看到的那样
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
IF:old.track\u name:new.track\u name
或者:old.track\u name为null,而:new.track\u name不为null
或者:old.track\u name不为null,而:new.track\u name则为null
case语句case当:old.track\u name为null时,则不需要使用“else to\u char(:old.track\u name)end
,因为null
和'
是相同的。如果null
值为空,您希望插入什么 但为什么我需要在IF语句中进行更改?因为在if语句中,我必须只检查旧值,而不等于新值,那么当语句中我进一步解释了它时,它就会出现。基本上,您不能比较NULL=NULL
,您可以做NULL=NULL
或'literal'='literal'
,但不能做NULL='literal'
或NULL=NULL
。在SQL中查找空比较,但为什么需要在IF语句中进行更改?因为在if语句中,我必须只检查旧值,而不等于新值,那么当语句中我进一步解释了它时,它就会出现。基本上,您不能比较NULL=NULL
,您可以做NULL=NULL
或'literal'='literal'
,但不能做NULL='literal'
或NULL=NULL
。在SQL中查找空比较,