加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver拆分字符串函数 及应用

发布时间:2020-12-12 13:04:49 所属栏目:MsSql教程 来源:网络整理
导读:USE [dataChange]GO/****** Object: UserDefinedFunction [dbo].[f_splitSTR] Script Date: 05/09/2016 15:04:21 span style="color:#ff0000;"自己修改数据库名,直接执行就可以了/span******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION
USE [dataChange]
GO
/****** Object:  UserDefinedFunction [dbo].[f_splitSTR]    Script Date: 05/09/2016 15:04:21 <span style="color:#ff0000;">自己修改数据库名,直接执行就可以了</span>******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[f_splitSTR](
	@s   varchar(8000),--待分拆的字符串
	@split varchar(10)     --数据分隔符
)RETURNS @re TABLE(
		col varchar(max))
AS
BEGIN
	DECLARE 
		@splitlen int

	-- 取分隔符的长度,在分隔符后面加一个字符是为了避免分隔符以空格结束时,取不到正确的长度
	SET @splitlen = LEN(@split + 'a') - 2
	-- 如果待分拆的字符串中存在数据分隔符,则循环取出每个数据项
	WHILE CHARINDEX(@split,@s)>0
	BEGIN
		-- 取第一个数据分隔符前的数据项
		INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s) - 1))
		
		-- 将已经取出的第一个数据项和数据分隔符从待分拆的字符串中去掉
		SET @s = STUFF(@s,1,@s) + @splitlen,'')
	END
	
	-- 保存最后一个数据项(最后一个数据项后面没有数据分隔符,故在前面的循环中不会被处理)
	INSERT @re VALUES(@s)
	RETURN   
  end

应用sql:实现数据分割 如数据:

B41J-002/145%B41J-002/15%B41J-003/36%B41J-000/00%B43K-001/00%B41J-002/045%B41J-002/055%B41J-002/21%B43K-008/00%B81B-007/04%B43K-029/00%B43K-027/00%B43K-029/093 ?

取每一组%数据中的前一位组合起来用%分割 得到数据为

B%B%B%B%B%B%B%B%B%B%B%B%B

update [<span style="font-family: Arial,Helvetica,sans-serif;">dataChange</span><span style="font-family: Arial,sans-serif;">].[dbo].[Patent_Info]</span>
  set IPC_ALL1 = temp.IPC1
			from (
				 select PUB_NO,IPC1 = STUFF(
								(select '%'+ltrim(IPC1) 
								from 
									(select c.PUB_NO,SUBSTRING(COL,2) as IPC1
									from(
										Select B.*,A.IPC_ALL,A.PUB_NO FROM [<span style="font-family: Arial,sans-serif;">].[dbo].[Patent_Info] A cross apply [</span><span style="font-family: Arial,sans-serif;">].[dbo].f_splitSTR(IPC_ALL,'%')  B</span>
										)c 
								)tt
								where PUB_NO= t.PUB_NO for XML path('')
							),'')
					from 
					(select c.PUB_NO,2) as IPC1
						from(
							Select B.*,'%')B)c</span><span style="font-family: Arial,sans-serif;">
</span>							)t							
					group by PUB_NO
			)temp
	where Patent_Info.PUB_NO = temp.PUB_NO

PUB_NO为数据表唯一字段标识

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读