DB2 SQLCODE = -420, ОШИБКА при сравнении полей smallint с нулевыми значениями

Я пытаюсь сравнить два поля smallint, чтобы найти различия. Одна таблица представляет собой таблицу ожидающих изменений, которая считывается ночью пакетным заданием, которое затем обновляет другую таблицу наряду с выполнением других действий. Пакетное задание имеет некоторые проблемы, и я исследую проблемы. Я хочу найти те значения, которые отличаются, и показать, какое значение таблицы в ожидании, когда это произойдет.

Конкретные столбцы (CO_FT_FREQ_DAY), которые доставляют мне проблемы, имеют нули в поле smallint, и я думаю, что это является причиной моих проблем. (или это может быть отложенное добавление, поэтому нет подходящего значения для сравнения...) Как видите, я пытался решить проблему, но это все еще не работает.
Я пробовал ifnull до этого, но получил та же ошибка. Я надеялся, что это решит проблему.

SELECT  T342.clientID
       ,T342.TS_340
       ,case when (case when t342.CO_FT_FREQ_DAY is null then 0 else
                        t342.CO_FT_FREQ_DAY end) <>
                    (case when t340.CO_FT_FREQ_DAY is null then 0 else
                         t340.CO_FT_FREQ_DAY end)
             then T342.CO_FT_FREQ_DAY
             else 0
             end as CO_FT_FREQ_DAY
FROM database.PendingChangeTable     T342
left outer join database.CurrentTable T340
on T340.ClientID = T342.ClientID
and T340.TS_PK = T342.TS_340
WHERE t342.clientID in (clientID list);

DSNT408I SQLCODE = -420, ОШИБКА: ЗНАЧЕНИЕ СТРОКОВОГО АРГУМЕНТА НЕ БЫЛО
ПРИЕМЛЕМЫМ ДЛЯ ФУНКЦИИ DECFLOAT
DSNT418I SQLSTATE = 22018 SQLSTATE КОД ВОЗВРАТА


person phipywr    schedule 04.02.2015    source источник


Ответы (1)


Угу Нашел проблему. Тот, кто разработал таблицу, переключился на средний поток и определил эти новые столбцы как поля char, и я пропустил это. Поэтому мне нужно было установить значение «0» вместо 0 в моем операторе case.

       ,case when (case when t342.CO_FT_FREQ_DAY is null then '0' else
                    t342.CO_FT_FREQ_DAY end) <>
                (case when t340.CO_FT_FREQ_DAY is null then '0' else
                     t340.CO_FT_FREQ_DAY end)
         then T342.CO_FT_FREQ_DAY
         else '0'
         end as CO_FT_FREQ_DAY
   ,case when ifnull(t342.CO_HT_FREQ_DAY,'0') <> 
                ifnull(t342.CO_HT_FREQ_DAY,'0')
         then ifnull(T340.CO_HT_FREQ_DAY,'0')
         else '0'
         end as CO_HT_FREQ_DAY

Итак, урок для меня сегодня: ВСЕГДА проверяйте свои типы данных, когда вы получаете эту ошибку!

person phipywr    schedule 04.02.2015
comment
Этот ответ очень помог мне!! Спасибо!! - person Johnson Jason; 13.06.2017