MYSQL创建一个 “将一个字符串以某个分隔符分隔得到多个值” 的函数,并为多个值加上序号

1:首先创建一个自定义函数实现分隔的功能:

思路:

(1、获取分隔符在源字符串中第一次出现的位置,把获取的位置之前的子字符串赋值给表的一列 (2、把第一步获取的位置之后的子字符串赋值为新的源字符串 (3、再获取分隔符在第二步得到的新的源字符串中的位置,并把获取的位置之前的子字符串赋值给表的一列 (4、重复第2、3步骤,直到子字符串中无分隔符;

CREATE FUNCTION f_splitt(@sep_s varchar(100), @s VARCHAR(1000)) --分隔符@sep_s
RETURNS @v_t TABLE(a VARCHAR(100))
AS
BEGIN
	DECLARE @i bigint;
	set @i=CHARINDEX(@sep_s,@s);
	while @i>0
	BEGIN
		INSERT @v_t VALUES(LEFT(@s,@i-1));
		set @s=SUBSTRING(@s,@i+1,LEN(@s)-@i);
		set @i=CHARINDEX(@sep_s,@s);
	END 
	IF @s<>'\'
	      INSERT @v_t(a) VALUES (@s);
	--print @s;
	RETURN
END:
比如:字符串"4|0|0|0|0|0|0|0|1|9|1|0|0" 被分割成13个数值。

2:创建存储过程从源表获取数据,经过分隔,插入到一个目标表中;

ALTER PROCEDURE get_rows
AS
begin 
		DECLARE @task_name VARCHAR(1000);
		DECLARE @store_code VARCHAR(100);
		DECLARE @member_code VARCHAR(100);
		DECLARE @addtime bigint;
		DECLARE @num_option_data VARCHAR(100);
		DECLARE cur_f cursor for SELECT task_name,store_code,member_code,addtime,num_option_data from kingkr_task_work;
		open cur_f
		FETCH NEXT from cur_f into @task_name,@store_code,@member_code,@addtime,@num_option_data;
		WHILE @@fetch_status=0
		BEGIN
			INSERT into kingkr_task_work_temp 
			SELECT @task_name,@store_code,@member_code,@addtime,a from dbo.f_splitt('|',@num_option_data);
			FETCH NEXT from cur_f into @task_name,@store_code,@member_code,@addtime,@num_option_data;
		END;
		CLOSE cur_f;
		DEALLOCATE cur_f;
end 

3:分隔成多个值后,再将这多个值排序


SELECT task,store_code,member_code,addtime,num_option_data,
row_number()OVER(partition by member_code,,addtime ORDER BY addtime) mm 
from kingkr_task_work_temp;

partition by member_code,addtime:把member_code,addtime作为一组(分区)排序。
结果如下:





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值