You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL函数将多行锻炼名称拼接为单个字符串?

问题解答

你的需求完全可行,而且不需要手动循环拼接,MySQL提供了更简洁高效的方式实现字符串拼接。

原代码的问题

你当前代码里的SELECT DISTINCT(exercise_name) INTO @names存在错误——INTO关键字只能将单个值存入变量,但你的查询会返回多行锻炼名称,执行时直接报错,无法将结果集存入单个变量。

最优实现:使用GROUP_CONCAT

MySQL内置的GROUP_CONCAT函数可直接将多行结果拼接成单个逗号分隔的字符串,完美匹配你的需求,代码简洁高效:

DELIMITER $$ 
CREATE FUNCTION get_exercises(workout_idV INTEGER, dateV DATE) RETURNS TEXT
BEGIN 
  DECLARE result_text TEXT;
  
  SELECT GROUP_CONCAT(DISTINCT exercise_name SEPARATOR ', ')
  INTO result_text
  FROM workout w 
  INNER JOIN `set` s ON s.workout_id = w.workout_id
  WHERE w.workout_id = workout_idV AND w.date = dateV;
  
  RETURN result_text;
END $$
DELIMITER ;

说明:

  • GROUP_CONCAT(DISTINCT exercise_name SEPARATOR ', '):自动去重后,用, 作为分隔符拼接所有锻炼名称
  • 直接将拼接结果存入变量result_text,无需手动循环

若必须用循环实现(不推荐)

如果出于特殊原因一定要手动循环拼接,可以使用游标遍历结果集:

DELIMITER $$ 
CREATE FUNCTION get_exercises(workout_idV INTEGER, dateV DATE) RETURNS TEXT
BEGIN 
  DECLARE done INT DEFAULT FALSE;
  DECLARE current_exercise VARCHAR(255);
  DECLARE result_text TEXT DEFAULT '';
  
  -- 定义游标,获取去重后的锻炼名称
  DECLARE exercise_cursor CURSOR FOR
    SELECT DISTINCT exercise_name
    FROM workout w 
    INNER JOIN `set` s ON s.workout_id = w.workout_id
    WHERE w.workout_id = workout_idV AND w.date = dateV;
    
  -- 定义游标终止条件
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  
  -- 打开游标
  OPEN exercise_cursor;
  
  -- 循环遍历结果
  read_loop: LOOP
    FETCH exercise_cursor INTO current_exercise;
    IF done THEN
      LEAVE read_loop;
    END IF;
    
    -- 拼接字符串:避免开头出现多余逗号
    IF result_text = '' THEN
      SET result_text = current_exercise;
    ELSE
      SET result_text = CONCAT(result_text, ', ', current_exercise);
    END IF;
  END LOOP;
  
  -- 关闭游标
  CLOSE exercise_cursor;
  
  RETURN result_text;
END $$
DELIMITER ;

说明:

  • 用游标逐行读取锻炼名称,拼接到结果字符串中
  • 需要处理初始为空的情况,避免开头出现多余逗号
  • 这种方式代码冗余,性能不如GROUP_CONCAT,仅作为特殊场景下的备选方案

内容的提问来源于stack exchange,提问作者wgraves25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:10:37