我在查询中有以下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
包装器可以完成这项工作?
答案 0 :(得分:2)
是的。 AS400(IBM i)期望case表达式上的所有分支都产生相同的类型。结果的类型由第一个分支确定。当结果的数据类型与第一个分支的数据类型不同时,它将返回null
。通过使用concat
包装器,结果的类型将更改为字符串。
答案 1 :(得分:0)
大概这是您的问题:
where sbfile in (5859480, 5859490) and SBBX0 = 343
limit 1
limit 1
建议查询的其余部分将返回多行。没有order by
。因此,返回的特定行是不确定的。在相同硬件上对相同数据执行相同查询的多次执行中,甚至可能会有所不同。
所以,我认为您的问题是正在运行的查询中返回了不同的行。