数据库中各种字符串的截取函数

  今天看见有人再问数据库中的数据截取了,我就和大家分享一下我看过的一篇有关这方面的文章吧。

  

  1 --各种字符串截取函数

  2  

  3 if exists (select * from dbo.ss where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))

  4 drop function [dbo].[f_splitSTR]

  5 GO

  6  

  7 --1 循环截取法

  8 CREATE FUNCTION f_splitSTR(

  9 @s   varchar(8000),   --待分拆的字符串

 10 @split varchar(10)     --数据分隔符

 11 )RETURNS @re TABLE(col varchar(100))

 12 AS

 13 BEGIN

 14     DECLARE @splitlen int

 15     SET @splitlen=LEN(@split+'a')-2

 16     WHILE CHARINDEX(@split,@s)>0

 17     BEGIN

 18         INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))

 19         SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')

 20     END

 21     INSERT @re VALUES(@s)

 22     RETURN

 23 END

 24 GO

 25  

 26  

 27 /*==============================================*/

 28  

 29 if exists (select * from dbo.ss where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))

 30 drop function [dbo].[f_splitSTR]

 31 GO

 32  

 33 --2 使用临时性分拆辅助表法

 34 CREATE FUNCTION f_splitSTR(

 35 @s   varchar(8000),  --待分拆的字符串

 36 @split varchar(10)     --数据分隔符

 37 )RETURNS @re TABLE(col varchar(100))

 38 AS

 39 BEGIN

 40     --创建分拆处理的辅助表(用户定义函数中只能操作表变量)

 41     DECLARE @t TABLE(ID int IDENTITY,b bit)

 42     INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

 43  

 44     INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)

 45     FROM @t

 46     WHERE ID<=LEN(@s+'a') 

 47         AND CHARINDEX(@split,@split+@s,ID)=ID

 48     RETURN

 49 END

 50 GO

 51  

 52 /*==============================================*/

 53  

 54 if exists (select * from dbo.ss where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))

 55 drop function [dbo].[f_splitSTR]

 56 GO

 57  

 58 if exists (select * from dbo.ss where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)

 59 drop table [dbo].[tb_splitSTR]

 60 GO

 61  

 62 --2.1 使用永久性分拆辅助表法

 63 --字符串分拆辅助表

 64 SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR

 65 FROM syscolumns a,syscolumns b

 66 GO

 67  

 68 --字符串分拆处理函数

 69 CREATE FUNCTION f_splitSTR(

 70 @s     varchar(8000),  --待分拆的字符串

 71 @split  varchar(10)     --数据分隔符

 72 )RETURNS TABLE

 73 AS

 74 RETURN(

 75     SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))

 76     FROM tb_splitSTR

 77     WHERE ID<=LEN(@s+'a') 

 78         AND CHARINDEX(@split,@split+@s,ID)=ID)

 79 GO

 80  

 81  

 82 /*==============================================*/

 83  

 84 if exists (select * from dbo.ss where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))

 85 drop function [dbo].[f_splitSTR]

 86 GO

 87  

 88 --3 将数据项按数字与非数字再次拆份

 89 CREATE FUNCTION f_splitSTR(

 90 @s   varchar(8000),    --待分拆的字符串

 91 @split varchar(10)     --数据分隔符

 92 )RETURNS @re TABLE(No varchar(100),Value varchar(20))

 93 AS

 94 BEGIN

 95     --创建分拆处理的辅助表(用户定义函数中只能操作表变量)

 96     DECLARE @t TABLE(ID int IDENTITY,b bit)

 97     INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

 98  

 99     INSERT @re 

100     SELECT    No=REVERSE(STUFF(col,1,PATINDEX('%[^-^.^0-9]%',col+'a')-1,'')),

101         Value=REVERSE(LEFT(col,PATINDEX('%[^-^.^0-9]%',col+'a')-1))

102     FROM(

103         SELECT col=REVERSE(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID))

104         FROM @t

105         WHERE ID<=LEN(@s+'a') 

106             AND CHARINDEX(@split,@split+@s,ID)=ID)a

107     RETURN

108 END

109 GO

110  

111  

112 /*==============================================*/

113  

114 if exists (select * from dbo.ss where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))

115 drop function [dbo].[f_splitSTR]

116 GO

117  

118 --3.1 分拆短信数据

119 CREATE FUNCTION f_splitSTR(@s varchar(8000))

120 RETURNS @re TABLE(split varchar(10),value varchar(100))

121 AS

122 BEGIN

123     DECLARE @splits TABLE(split varchar(10),splitlen as LEN(split))

124     INSERT @splits(split)

125     SELECT 'AC' UNION ALL

126     SELECT 'BC' UNION ALL

127     SELECT 'CC' UNION ALL

128     SELECT 'DC'   

129     DECLARE @pos1 int,@pos2 int,@split varchar(10),@splitlen int

130     SELECT TOP 1 

131         @pos1=1,@split=split,@splitlen=splitlen

132     FROM @splits

133     WHERE @s LIKE split+'%'

134     WHILE @pos1>0

135     BEGIN

136         SELECT TOP 1

137             @pos2=CHARINDEX(split,@s,@splitlen+1)

138         FROM @splits

139         WHERE CHARINDEX(split,@s,@splitlen+1)>0

140         ORDER BY CHARINDEX(split,@s,@splitlen+1)

141         IF @@ROWCOUNT=0

142         BEGIN

143             INSERT @re VALUES(@split,STUFF(@s,1,@splitlen,''))

144             RETURN

145         END

146         ELSE

147         BEGIN

148             INSERT @re VALUES(@split,SUBSTRING(@s,@splitlen+1,@pos2-@splitlen-1))

149             SELECT TOP 1 

150                 @pos1=1,@split=split,@splitlen=splitlen,@s=STUFF(@s,1,@pos2-1,'')

151             FROM @splits

152             WHERE STUFF(@s,1,@pos2-1,'') LIKE split+'%'

153         END

154     END

155     RETURN

156 END

157 GO
View Code

   在增加知识的同时,也希望能帮助有需要的盆友,同时也希望大家共同进步,互相学习。

你可能感兴趣的:(数据库)