牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-12-22 投稿人: 浏览次数:1915
思路:

(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个数值。
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 

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作为一组(分区)排序。
结果如下:





            
                
				
			
		
        	
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。