2016-04-19 4 views
0

Я пишу триггер, в котором мне нужно вставить значение в таблицу track, если значение изменяется в таблице parent_key. Я должен проверить, является ли значение значением null, а затем установить для него пустое значение старого значения и то же самое, что я должен сделать для нового значения. Я попробовал приведенный ниже оператор case, но не вставлял его в таблицу треков, если начальное значение old/new равно null.case when null then empty in oracle insert statement

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

В оракула, пустая строка '' точно так же, как и null.

Вы можете изменить ваш IF на следующее:

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

Поскольку вы не можете сравнить null = null

+0

, но почему мне нужно менять инструкцию IF? Потому что в выражении if я должен проверять только старое значение, а не равное новому значению, тогда оно поступит в случае, когда оператор – Andrew

+0

Я объяснил это дальше. В принципе, вы не можете сравнивать «NULL = NULL», вы можете сделать «NULL NULL» или '' literal '=' literal'', но не 'NULL = 'literal'' или' NULL = NULL'. Посмотрите нулевые сравнения в SQL, – gmiley

1

сравнение обоих null = null и not (null = null) результатов фальшива, как вы можете видеть это заявление

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?