这个表是从excel导过来的,导致‘说明’字段分行,为什么我的这段sql不能实现数据合并,不报错,也一直运行不出来

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

这个表是从excel导过来的,导致‘说明’字段分行,为什么我的这段sql不能实现数据合并,不报错,也一直运行不出来

CREATE DEFINER=`bdo`@`%` PROCEDURE `编码`()
BEGIN
DECLARE a int(10) default 7936; 
DECLARE b VARCHAR(255);
DECLARE c VARCHAR(255);
DECLARE d VARCHAR(255);
while a>0 DO 
if (select Sheet1_copy1.`编码` from Sheet1_copy1 where id=a) is NULL AND (select Sheet1_copy1.`品目名称` from Sheet1_copy1 where id=a) is NULL
THEN
SELECT Sheet1_copy1.`说明` into b
from Sheet1_copy1
WHERE  id = a;
select Sheet1_copy1.`说明` into c
from Sheet1_copy1
where id = a-1;
SET d =CONCAT(c,b);
update Sheet1_copy1
set Sheet1_copy1.`说明` = d
where id = a-1;
set a=a-1;
end if;
END WHILE; 
END

img

错误是这样的:

img


可以参照这个写,我验证过的:

CREATE DEFINER=`root`@`%` PROCEDURE `test_excel`()
BEGIN
    DECLARE isFlag INT DEFAULT TRUE;
    declare id int;
    declare code varchar(20);
    declare remark varchar(20);
    declare allRemark text;
    declare cur cursor for 
    select exel_a.id,exel_a.code,exel_a.remark from csdn_test.exel_a order by exel_a.id desc;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET isFlag = FALSE;
    open cur;
    getName: loop
    fetch cur into id,code,remark;
    if isFlag is FALSE then
        LEAVE getName;
    end if;
    if code is null then
        set allRemark=concat(remark,ifnull(allRemark,''));
    else 
        UPDATE exel_a 
SET 
    exel_a.remark = CONCAT(exel_a.remark, IFNULL(allRemark, ''))
WHERE
    exel_a.id = id;
        set allRemark=null;
    end if;
    end loop getName;
    close cur;
END

之前也遇到过类似的情况,从excel里导数据进数据库会出现换行的情况,当时是因为在excel里的某个单元格,出现了换行符,才导致放进数据库的时候,就会换一行

1、可以直接用SQL来更新,MySQL5.7 测试通过

    UPDATE sheet1_copy1 k
          , ( SELECT new_id, group_concat( 说明 ORDER BY id ) 说明
                FROM ( SELECT *, @ii := ( CASE WHEN ifnull( a.编码, a.品目名称 ) IS NULL THEN  @ii ELSE a.id END ) AS new_id
                         FROM sheet1_copy1 a, ( SELECT @ii := 1 ) b ) t
               GROUP BY new_id )
              HAVING count( 1 ) > 1 ) m
       SET k.说明 = m.说明
     WHERE k.id = m.new_id;

这个是整个表所有存在问题的记录全部更新,你也可以指定一些 new_id 来更新

一行变多行多数是换行符导致的,能设置的话可以设置断行的判定符号,否则可以通过替换的方式替换掉换行符。