DB2中CASE WHEN嵌套JSON_OBJECT返回JSON结果异常问题咨询
DB2中CASE WHEN内使用JSON_OBJECT导致结果被编码为字符串的问题解决
问题现象
在DB2里,当把JSON_OBJECT放在CASE WHEN语句中使用时,生成的JSON对象会被自动编码为字符串格式,而非预期的原生JSON类型。示例代码片段如下:
...), json_object('uomId' value 'PL','ratio' value :mgve,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM'), case when :vpe = 'TE' and :mgvpe > 1 THEN json_object('uomId' value 'TE','ratio' value :mgvpe,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM') END...
执行后,CASE WHEN分支返回的内容会被转义成带引号包裹的字符串,无法作为JSON对象直接使用。
问题原因
DB2的CASE语句会自动统一所有分支的返回数据类型。当CASE语句没有显式指定ELSE分支时,不满足条件的情况会返回NULL,而NULL的默认类型与JSON_OBJECT生成的JSON类型不兼容,DB2会将JSON隐式转换为字符串类型以适配统一的返回类型。
解决方案
方案一:显式转换为JSON类型
在CASE语句外层使用JSON()函数,强制将结果转换为JSON类型:
...), json_object('uomId' value 'PL','ratio' value :mgve,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM'), JSON(case when :vpe = 'TE' and :mgvpe > 1 THEN json_object('uomId' value 'TE','ratio' value :mgvpe,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM') END)...
方案二:统一分支返回JSON类型
给CASE语句添加ELSE分支,返回一个空的JSON对象,确保所有分支的返回类型都是JSON,避免DB2进行隐式转换:
...), json_object('uomId' value 'PL','ratio' value :mgve,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM'), case when :vpe = 'TE' and :mgvpe > 1 THEN json_object('uomId' value 'TE','ratio' value :mgvpe,'baseUomFlag' value 'false','pickUomFlag' value 'false','putawayUomFlag' value 'false','storageCluster' value 'AB_ITEM') ELSE json_object() END...
内容的提问来源于stack exchange,提问作者Herbert Pfeifer
相关产品推荐
相关产品推荐

