mysql分解字符串插入多行

商品的sku本来应该是独立的,唯一的,

比如链子的sku是L001,L002,L003这样的,吊坠的是D001,D002,D003这样的,

可是由于历史原因,有些产品组合起来销售,它们的sku是别的sku组合起来的,

比如链子+吊坠的:L001+D002这样的,

可是统计的时候又要按独立的sku,那就要把订单拆分插入表中,

比如一个订单的sku是L001+D002,就要拆分为2行,每行的sku分别是L001和D002

下面先在mysql里面创建一个存储过程,用于把一条组合产品的记录拆分为2条插入数据库:

DELIMITER $$

USE `aporroreport`$$

DROP PROCEDURE IF EXISTS `sku_split_insert_order`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sku_split_insert_order`(sku VARCHAR(255), orderid INT)
BEGIN  
    DECLARE sku_num INT; #该Sku里面实际上包含多个sku, 通过+分隔,这里只计算+的数量
    DECLARE sku_i INT;  #临时变量
    DECLARE tmp_sku VARCHAR(255); #临时拆分出来的sku
    DELETE FROM `sku_orders_products_list`;  #先清空表
    
    #本来正确的sku_num应该是+1,但这里因为下标从1开始,所以+2
    SET sku_num = LENGTH(sku) - LENGTH(REPLACE(sku,'+',''))+2;
    SET sku_i = 1;
    
    WHILE sku_i < sku_num DO    
	#一段一段地截取sku
	SET tmp_sku = SUBSTRING_INDEX(SUBSTRING_INDEX(sku,'+',sku_i),'+',-1);
	#插入表
	INSERT INTO  `sku_orders_products_list`(sku,orderid) VALUES(tmp_sku, orderid);
	SET sku_i = sku_i + 1;
    END WHILE; 	         
END$$

DELIMITER ;
执行 

CALL sku_split_insert_order('L001+D002', 888)

结果:


最后的存储过程:

DELIMITER $$
USE `aporroreport`$$
DROP PROCEDURE IF EXISTS `test_copy_order`$$
CREATE PROCEDURE `test_copy_order`()

BEGIN
  #把一个订单表的数据转到另一个表中,因为其中的sku实际上是由多个sku加起来的,现在要拆分
  #即:2个sku组合的拆分为2行,3个sku组合的拆分为3行
  
  #--定义接收游标数据的变量 
  DECLARE sku VARCHAR(200); #临时的sku
  DECLARE sku_num INT; #该Sku里面实际上包含多个sku, 通过+分隔,这里计算独立的sku的数量
  DECLARE sku_i INT;  #临时变量
  DECLARE tmp_sku VARCHAR(255); #临时拆分出来的sku
    
  DECLARE orderid INT;
  #-- 游标 
  #-- 遍历数据结束标志
  DECLARE done INT DEFAULT FALSE;
  
  #查询的时候要加别名,否则查不到数据
  DECLARE cur CURSOR FOR SELECT t.sku, t.orderid  FROM  `aporro_orders_products_list` AS t ;

  #-- 将结束标志绑定到游标
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  #-- 打开游标
  
  OPEN cur;
 
  #-- 开始循环
  read_loop:LOOP
    #-- 提取游标里的数据
    FETCH cur INTO sku,orderid;
   
    #-- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;
    
    #统计独立的sku数量,本来正确的sku_num应该是+1,但这里因为SUBSTRING_INDEX下标从1开始,所以+2
    SET sku_num = LENGTH(sku) - LENGTH(REPLACE(sku,'+',''))+2;
    SET sku_i = 1;
    
    WHILE sku_i < sku_num DO    
	#一段一段地截取sku
	SET tmp_sku = SUBSTRING_INDEX(SUBSTRING_INDEX(sku,'+',sku_i),'+',-1);
	#插入另一个表,这个表里sku都不带加号了
	INSERT INTO `sku_orders_products_list`(sku,orderid) VALUES(tmp_sku, orderid);
	#取下一段sku
	SET sku_i = sku_i + 1;
    END WHILE; 	   
    
  END LOOP;
 
  #-- 关闭游标
  CLOSE cur;

END$$

DELIMITER ;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值