MYSQL创建一个 “将一个字符串以某个分隔符分隔得到多个值” 的函数,并为多个值加上序号
思路:
(1、获取分隔符在源字符串中第一次出现的位置,把获取的位置之前的子字符串赋值给表的一列 (2、把第一步获取的位置之后的子字符串赋值为新的源字符串 (3、再获取分隔符在第二步得到的新的源字符串中的位置,并把获取的位置之前的子字符串赋值给表的一列 (4、重复第2、3步骤,直到子字符串中无分隔符;
CREATE FUNCTION f_splitt(@sep_s varchar(100), @s VARCHAR(1000)) --分隔符@sep_sRETURNS @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作为一组(分区)排序。
结果如下:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: JSP页面用EL表达式 输出date格式
- 下一篇: PHP使用mysqli进行数据读取