Почему этот случай выбора AS400 DB2 неожиданно переходит в ноль? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующее case выражение внутри запроса, которое дает null для столбца per_pack_qty:

select
    global_override.SHIS8,
    case    
        when sbsize = 8 and 
             global_override.SHIS8 is not null and 
              trim(global_override.SHIS8) not in ('', '0') 
        then global_override.SHIS8
        else sbsizu
    end as per_pack_qty

from 
    order s
    left join order_override on order_override.orfile = s.sbfile
    left join global_override on global_override.shfile = s.sbfile

where
    sbfile in (5859480, 5859490)
    and SBBX0 = 343
limit 1

Выполнение выходов per_pack_qty null и SHIS8 "0".

Однако, если я поставлю конкат около global_override.SHIS8, например:

[...] then concat(global_override.SHIS8, '') [...]

Тогда дело разрешится до sbsizu.

Приводит ли значение NULL в качестве подвыражения then к тому, что все выражение case становится нулевым?Является ли DB2 AS400 требовательной ко всем ветвям в выражении case одного и того же типа?Почему оболочка concat делает эту работу?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Да.AS400 (IBM i) ожидает, что все ветви в выражении case приведут к одному и тому же типу.Тип результата определяется первой ветвью.Возвращает null, когда тип данных результата отличается от типа данных первой ветви.При использовании оболочки concat тип результата изменяется на строку.

0 голосов
/ 27 сентября 2018

Предположительно, это ваша проблема:

where sbfile in (5859480, 5859490) and SBBX0 = 343
limit 1

limit 1 предполагает, что остальная часть запроса вернет несколько строк.Там нет order by.Следовательно, конкретная возвращаемая строка является неопределенной.Это может даже зависеть от нескольких выполнений одного и того же запроса на одних и тех же данных на одном и том же оборудовании.

Итак, я предполагаю, что ваша проблема заключается в том, что в выполняемых запросах возвращаются разные строки.

...