SqlServer教程—第三章(字符处理一)

SqlServer教程—第三章(字符处理一),第1张

概述一、字符串的分拆处理函数 1-- 循环截取法 CREATE FUNCTION f_splitSTR( @s   varchar(8000),   --待分拆的字符串 @split varchar(10)     --数据分隔符 )RETURNS @re TABLE(col varchar(100)) AS BEGIN  DECLARE @splitlen int  SET @splitlen=LE

一、字符串的分拆处理函数

1-- 循环截取法@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s   varchar(8000),   --待分拆的字符串@H_403_9@ @split varchar(10)     --数据分隔符@H_403_9@ )RETURNS @re table(col varchar(100))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@  DECLARE @splitlen int@H_403_9@  SET @splitlen=LEN(@split+'a')-2@H_403_9@  WHILE CHARINDEX(@split,@s)>0@H_403_9@  BEGIN@H_403_9@   INSERT @re VALUES(left(@s,CHARINDEX(@split,@s)-1))@H_403_9@   SET @s=STUFF(@s,1,@s)+@splitlen,'')@H_403_9@  END@H_403_9@  INSERT @re VALUES(@s)@H_403_9@  RETURN@H_403_9@ END@H_403_9@ GO@H_403_9@

2--使用临时性分拆辅助表法@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s   varchar(8000),  --待分拆的字符串@H_403_9@ @split varchar(10)     --数据分隔符@H_403_9@ )RETURNS @re table(col varchar(100))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@  --创建分拆处理的辅助表(用户定义函数中只能 *** 作表变量)@H_403_9@  DECLARE @t table(ID int IDENTITY,b bit)@H_403_9@  INSERT @t(b) SELECT top 8000 0 FROM syscolumns a,syscolumns b

 INSERT @re SELECT SUBSTRING(@s,ID,@s+@split,ID)-ID)@H_403_9@  FROM @t@H_403_9@  WHERE ID<=LEN(@s+'a') @H_403_9@   AND CHARINDEX(@split,@split+@s,ID)=ID@H_403_9@  RETURN@H_403_9@ END@H_403_9@ GO

 

3-- 使用永久性分拆辅助表法@H_403_9@ --字符串分拆辅助表@H_403_9@ SELECT top 8000 ID=IDENTITY(int,1) INTO dbo.tb_splitSTR@H_403_9@ FROM syscolumns a,syscolumns b@H_403_9@ GO

--字符串分拆处理函数@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s     varchar(8000),  --待分拆的字符串@H_403_9@ @split  varchar(10)     --数据分隔符@H_403_9@ )RETURNS table@H_403_9@ AS@H_403_9@ RETURN(@H_403_9@  SELECT col=CAST(SUBSTRING(@s,ID)-ID) as varchar(100))@H_403_9@  FROM tb_splitSTR@H_403_9@  WHERE ID<=LEN(@s+'a') @H_403_9@   AND CHARINDEX(@split,ID)=ID)@H_403_9@ GO

4--将数据项按数字与非数字再次拆份@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s   varchar(8000),    --待分拆的字符串@H_403_9@ @split varchar(10)     --数据分隔符@H_403_9@ )RETURNS @re table(No varchar(100),Value varchar(20))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@  --创建分拆处理的辅助表(用户定义函数中只能 *** 作表变量)@H_403_9@  DECLARE @t table(ID int IDENTITY,syscolumns b

 INSERT @re @H_403_9@  SELECT No=REVERSE(STUFF(col,PATINDEX('%[^-^.^0-9]%',col+'a')-1,'')),@H_403_9@   Value=REVERSE(left(col,col+'a')-1))@H_403_9@  FROM(@H_403_9@   SELECT col=REVERSE(SUBSTRING(@s,ID)-ID))@H_403_9@   FROM @t@H_403_9@   WHERE ID<=LEN(@s+'a') @H_403_9@    AND CHARINDEX(@split,ID)=ID)a@H_403_9@  RETURN@H_403_9@ END@H_403_9@ GO

 

二、字符串的合并

 

1--使用游标法进行字符串合并处理的示例。@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),col2 int)@H_403_9@ INSERT tb SELECT 'a',1@H_403_9@ UNION ALL SELECT 'a',2@H_403_9@ UNION ALL SELECT 'b',1@H_403_9@ UNION ALL SELECT 'b',3

--合并处理@H_403_9@ --定义结果集表变量@H_403_9@ DECLARE @t table(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理@H_403_9@ DECLARE tb CURSOR LOCAL@H_403_9@ FOR@H_403_9@ SELECT col1,col2 FROM tb ORDER BY  col1,col2@H_403_9@ DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)@H_403_9@ OPEN tb@H_403_9@ FETCH tb INTO @col1,@col2@H_403_9@ SELECT @col1_old=@col1,@s=''@H_403_9@ WHILE @@FETCH_STATUS=0@H_403_9@ BEGIN@H_403_9@  IF @col1=@col1_old@H_403_9@   SELECT @s=@s+','+CAST(@col2 as varchar)@H_403_9@  ELSE@H_403_9@  BEGIN@H_403_9@   INSERT @t VALUES(@col1_old,STUFF(@s,''))@H_403_9@   SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1@H_403_9@  END@H_403_9@  FETCH tb INTO @col1,@col2@H_403_9@ END@H_403_9@ INSERT @t VALUES(@col1_old,''))@H_403_9@ CLOSE tb@H_403_9@ DEALLOCATE tb@H_403_9@ --显示结果并删除测试数据@H_403_9@ SELECT * FROM @t@H_403_9@ DROP table tb@H_403_9@ /*--结果@H_403_9@ col1       col2@H_403_9@ ---------- -----------@H_403_9@ a          1,2@H_403_9@ b          1,2,3@H_403_9@ --*/@H_403_9@ GO

2--使用用户定义函数,配合SELECT处理完成字符串合并处理的示例@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),3@H_403_9@ GO

--合并处理函数@H_403_9@ CREATE FUNCTION dbo.f_str(@col1 varchar(10))@H_403_9@ RETURNS varchar(100)@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@  DECLARE @re varchar(100)@H_403_9@  SET @re=''@H_403_9@  SELECT @re=@re+','+CAST(col2 as varchar)@H_403_9@  FROM tb@H_403_9@  WHERE col1=@col1@H_403_9@  RETURN(STUFF(@re,''))@H_403_9@ END@H_403_9@ GO

--调用函数@H_403_9@ SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1@H_403_9@ --删除测试@H_403_9@ DROP table tb@H_403_9@ DROP FUNCTION f_str@H_403_9@ /*--结果@H_403_9@ col1       col2@H_403_9@ ---------- -----------@H_403_9@ a          1,3@H_403_9@ --*/@H_403_9@ GO

 

3-- 使用临时表实现字符串合并处理的示例@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),3

--合并处理@H_403_9@ SELECT col1,col2=CAST(col2 as varchar(100)) @H_403_9@ INTO #t FROM tb@H_403_9@ ORDER BY col1,col2@H_403_9@ DECLARE @col1 varchar(10),@col2 varchar(100)@H_403_9@ UPDATE #t SET @H_403_9@  @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,@H_403_9@  @col1=col1,@H_403_9@  col2=@col2 SELECT * FROM #t /*--更新处理后的临时表 col1       col2 ---------- ------------- a          1 a          1,2 b          1 b          1,2 b          1,3 --*/ --得到最终结果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /*--结果 col1       col2 ---------- ----------- a          1,3 --*/ --删除测试 DROP table tb,#t GO

总结

以上是内存溢出为你收集整理的SqlServer教程第三章(字符处理一)全部内容,希望文章能够帮你解决SqlServer教程—第三章(字符处理一)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1180223.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存