为什么此AS400 DB2 select案例出人意料地解决为null?

时间:2018-09-26 23:48:25

标签: sql ibm-midrange db2-400

我在查询中有以下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

运行将产生null的per_pack_qty和“ 0”的SHIS8。

但是,如果我在global_override.SHIS8周围放置concat,例如:

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

然后案件解决为 sbsizu

作为then子表达式的空值是否会导致整个case表达式计算为空? AS400 DB2是否对case表达式中的所有分支产生相同的类型感到挑剔?为什么concat包装器可以完成这项工作?

2 个答案:

答案 0 :(得分:2)

是的。 AS400(IBM i)期望case表达式上的所有分支都产生相同的类型。结果的类型由第一个分支确定。当结果的数据类型与第一个分支的数据类型不同时,它将返回null。通过使用concat包装器,结果的类型将更改为字符串。

答案 1 :(得分:0)

大概这是您的问题:

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

limit 1建议查询的其余部分将返回多行。没有order by。因此,返回的特定行是不确定的。在相同硬件上对相同数据执行相同查询的多次执行中,甚至可能会有所不同。

所以,我认为您的问题是正在运行的查询中返回了不同的行。