这个表是从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
错误是这样的:
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 来更新
一行变多行多数是换行符导致的,能设置的话可以设置断行的判定符号,否则可以通过替换的方式替换掉换行符。