MySQL REPEAT循环修改计数变量后提前终止,变量返回NULL问题求助
问题根因
- MySQL内置的
CONCAT()函数存在NULL传导特性:只要任意一个输入参数为NULL,最终返回结果就会是NULL。当循环运行到id=1的根节点记录时,pid字段值为NULL,赋值后@i变为NULL,下一轮循环查询id=NULL的记录不存在,子查询返回NULL,直接导致@c被赋值为NULL。 - 原终止条件存在隐式类型转换问题:
@i是无符号整数类型,COALESCE(@i, '')会自动把空字符串转为数字0,导致原判断逻辑永远不会命中,反而会触发id=0的无效查询,最终两个变量都变为NULL,循环异常终止。
修复方案
直接调整终止条件为判断@i IS NULL,同时用COALESCE包裹查询结果避免NULL传导即可,修复后代码如下:
SET @c = ''; SET @i = 4; REPEAT SET @c = CONCAT( ' -> ', COALESCE((SELECT name FROM c WHERE id = @i), ''), @c ); SET @i = (SELECT pid FROM c WHERE id = @i); UNTIL @i IS NULL END REPEAT; -- 去除开头多余的箭头(可选) SELECT TRIM(LEADING ' -> ' FROM @c) AS parent_path;
运行后返回的路径结果为:1st -> 2nd -> 3rd -> 4th,符合预期逻辑。
内容的提问来源于stack exchange,提问作者MRS1367
相关产品推荐
相关产品推荐

