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

来源:互联网 发布:js打印乘法表 编辑:程序博客网 时间:2024/04/27 23:59

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))ASBEGINDECLARE @i bigint;set @i=CHARINDEX(@sep_s,@s);while @i>0BEGININSERT @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;RETURNEND:
比如:字符串"4|0|0|0|0|0|0|0|1|9|1|0|0" 被分割成13个数值。

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

ALTER PROCEDURE get_rowsASbegin 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_fFETCH NEXT from cur_f into @task_name,@store_code,@member_code,@addtime,@num_option_data;WHILE @@fetch_status=0BEGININSERT 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作为一组(分区)排序。
结果如下:


                                             
0 0
原创粉丝点击