请求修正带条件的DB2字符截取查询(SQLCODE=-138报错)
解决DB2查询中SQLCODE=-138的问题
问题原因分析
你遇到的SQLCODE=-138, SQLSTATE=22011错误,本质是标量函数的参数超出了合法范围,具体到你的查询里,是SUBSTR函数的起始位置参数非法了。
当CLASSIFICATION列满足以下两种情况时,就会触发这个错误:
- 列中不存在
\字符:此时LOCATE('\',CLASSIFICATION)返回0,计算0-2=-2,负数作为SUBSTR的起始位置是不允许的 \出现在字符串的前两位:比如\abc或者a\bc,此时LOCATE返回1或2,计算后得到-1或0,同样是无效的起始位置
修复后的查询语句
我们需要先添加判断条件,确保\的位置足够靠后(至少在第3位),再执行后续的截取和判断逻辑:
SELECT SERVICE_REQUEST, CASE -- 先校验\的位置是否合法,再判断前一位是否为0 WHEN LOCATE('\', CLASSIFICATION) > 2 AND SUBSTR(CLASSIFICATION, LOCATE('\', CLASSIFICATION)-2, 1) = '0' THEN RIGHT(CLASSIFICATION, LENGTH(CLASSIFICATION) - LOCATE('\', CLASSIFICATION)) ELSE CLASSIFICATION END AS CLASSIFICATION2 FROM REPORTDB3.MAXIMO_INDIA_SR_MONTHLY_REPORT WHERE LENGTH(SERVICE_REQUEST) = 7;
额外优化建议
如果想让逻辑更严谨,还可以处理LOCATE返回0(即无\)的场景,写法上可以合并判断:
SELECT SERVICE_REQUEST, CASE WHEN LOCATE('\', CLASSIFICATION) BETWEEN 3 AND LENGTH(CLASSIFICATION) AND SUBSTR(CLASSIFICATION, LOCATE('\', CLASSIFICATION)-2, 1) = '0' THEN RIGHT(CLASSIFICATION, LENGTH(CLASSIFICATION) - LOCATE('\', CLASSIFICATION)) ELSE CLASSIFICATION END AS CLASSIFICATION2 FROM REPORTDB3.MAXIMO_INDIA_SR_MONTHLY_REPORT WHERE LENGTH(SERVICE_REQUEST) = 7;
这里BETWEEN 3 AND LENGTH(CLASSIFICATION)同时确保了\存在且位置不超过字符串长度,避免了所有参数非法的情况。
内容的提问来源于stack exchange,提问作者Sambit
相关产品推荐
相关产品推荐

