如何在BIRT中实现列值为null时用另一列值替换
你的表达式存在多处逻辑错误,是导致报表加载失败的核心原因,具体问题和修正方案如下:
原有表达式的问题
- 逻辑完全写反:你当前的判断分支中,取出的是还未完成计算的
row["contact"]本身,属于循环引用,完全没有用到你已有的邮箱、手机号两个原始字段值 - 无有效返回值:BIRT计算列的表达式需要直接返回该列最终要填充的值,你原有代码中if分支没有写return语句,最后else分支反而返回了布尔类型的
true,和你需要的邮箱/手机号字符串类型完全不匹配,类型冲突会直接导致报表加载异常 - 冗余判断:根据你的描述两个原始字段必然一空一有值,无需写多分支判断,也不需要else兜底分支
修正后的表达式
你可以直接用更简洁的三目运算符写法,验证通过即可正常使用:
// 若邮箱列为空则返回手机号,否则返回邮箱,完全匹配你的需求 row["destination"] == null ? row["contactnumber"] : row["destination"]
如果习惯用if写法,也可以用以下版本:
if(row["destination"] == null) { return row["contactnumber"]; } return row["destination"];
额外兼容方案
如果你的SQL查询中可能返回空字符串而非null值,可额外增加空字符串判断避免异常:
(row["destination"] == null || row["destination"].trim() === "") ? row["contactnumber"] : row["destination"]
内容的提问来源于stack exchange,提问作者TheOx
相关产品推荐
相关产品推荐

