存储过程Case

存储过程(MySQL)
数据准备

CREATE TABLE `km` (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `idpath` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ;

INSERT INTO `km` VALUES (1, '收入', '0');
INSERT INTO `km` VALUES (2, '支出', '0');
INSERT INTO `km` VALUES (3, '内部收入', '0-1');
INSERT INTO `km` VALUES (4, '服务收入', '0-1-3');
INSERT INTO `km` VALUES (5, '演讲', '0-1-3-4');
INSERT INTO `km` VALUES (6, '成本', '0-2');
INSERT INTO `km` VALUES (7, '家具采购', '0-2-6');
INSERT INTO `km` VALUES (8, '课桌', '0-2-6-8');
INSERT INTO `km` VALUES (9, '椅子', '0-2-6-8');

根据idpath动态生成数据列

CREATE PROCEDURE `km_procedure`()
Begin
	Declare len Int;  -- 要增加的列数
	Declare J Int DEFAULT 1;
	Declare v_sql Varchar(500) default '';

	Select max(LENGTH(Replace(idpath,'-',''))) into len From km; -- 获取idpath的最大长度作为列数
	-- 创建临时表
	drop table if exists tmp_table;
	Create TEMPORARY Table if not exists tmp_table(select id,name,idpath from km);
	-- 动态增加列
	set J = 1;
	set v_sql = '';
	While J<=len DO
		set v_sql = concat('Alter Table tmp_table Add km',J,' Varchar(100);');
		Set J=J+1;
		set @p_sql = v_sql;
		prepare stmt from @p_sql; -- 预处理sql语句
		EXECUTE stmt;                  -- 执行sql语句
	END WHILE;
    -- 给动态增加的列赋值
	set J = 1;
	set v_sql = '';
	While J<=len DO
		set v_sql = concat('update tmp_table set km',J,
			'=substring_index(substring_index(idpath,''-'',', J,'), ''-'', -1) where (length(idpath)-length(Replace(idpath,''-'',''''))) >= ',J-1);
		set @p_sql = v_sql;
		prepare stmt from @p_sql; 
		EXECUTE stmt;
		Set J=J+1;
	END WHILE;
	deallocate prepare stmt; -- 释放预处理的sql语句
	SELECT * from tmp_table;
End

效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值