DB2中CASE嵌入CAST转换导致数据异常的原因咨询
问题描述
我的数据库包含vendor invoice number(供应商发票编号)列,该列同时存储字符串和整数数据。由于Excel与Db2兼容性不佳,我尝试在输出时格式化数据以实现报表自动化。
现有一段可正常运行的代码:
CASE WHEN substring(vendor_invoice_number,1,1) = 0 or lcase(substring(vendor_invoice_number,1,1)) between 'a' and 'z' THEN TRIM(vendor_invoice_number) END as "invoice", cast(vendor_invoice_number as INT)
这段代码会生成两列,我在Excel中用IF(ISNA)函数选择正确的列。但如果将cast(vendor_invoice_number as INT)作为CASE语句的ELSE分支后,会出现两个问题:一是所有字符串发票编号、带前导零的编号全部丢失;二是整列数据均转为INTEGER类型,即使是符合WHEN条件的行也是如此。想了解该现象的原因。
问题原因
Db2的CASE语句有个核心规则:所有分支返回的数据类型必须统一,它会自动把所有分支的结果隐式转换为优先级更高的那种数据类型。
具体到你的场景:
- INTEGER(整数)类型的优先级远高于VARCHAR(字符串)类型,当你把
cast(vendor_invoice_number as INT)作为ELSE分支时,Db2会强制将WHEN分支返回的字符串结果也转换为INTEGER类型。 - 带字母的字符串发票编号无法转换为整数,直接变为NULL;带前导零的字符串转成整数后,前导零会被自动丢弃——因为整数本身并不存储前导零。
- 最终整列的数据类型被统一为INTEGER,哪怕是符合WHEN条件的行,原本的字符串结果也会被强制转换,自然就丢失了你想要保留的原数据。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

