SUBSTR动态截取字符串时长度异常及越界问题求助
问题原因与解决方法
你的问题出在SUBSTR的长度参数计算上:
- 当前长度参数是
INSTR(t.variable, '*', 1, 3) - INSTR(t.variable, '*', 1, 2),这个值等于第二个*到第三个*的总字符数(包括第三个*本身),所以截取结果会多带一个*字符。 - 当你尝试减1时,如果字符串中不存在第三个
*,INSTR(...,3)会返回0,此时计算出的长度会是负数,触发越界错误。
修正后的代码
要准确截取两个*之间的内容,长度参数应该是第三个*的位置减去第二个*的位置再减1,同时要处理没有第三个*的边界情况:
方案1:用CASE处理边界
如果不存在第三个*时需要截取第二个*之后的所有内容,可使用CASE分支:
SELECT SUBSTR( t.variable, INSTR(t.variable, '*', 1, 2) + 1, CASE WHEN INSTR(t.variable, '*', 1, 3) > 0 THEN INSTR(t.variable, '*', 1, 3) - INSTR(t.variable, '*', 1, 2) - 1 ELSE LENGTH(t.variable) - INSTR(t.variable, '*', 1, 2) END ) FROM test t;
方案2:用GREATEST确保长度非负
如果不存在第三个*时不需要截取后续内容,可通过GREATEST把长度限制为0:
SELECT SUBSTR( t.variable, INSTR(t.variable, '*', 1, 2) + 1, GREATEST(INSTR(t.variable, '*', 1, 3) - INSTR(t.variable, '*', 1, 2) - 1, 0) ) FROM test t;
以你的示例值XBR*jkhehj8f22*3012367134*CVHI*N* X*G*P测试,修正后的代码会正确返回jkhehj8f22,不会包含多余的*。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

