亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

分割字符串的應用

2024-07-21 02:46:43
字體:
來源:轉載
供稿:網友
分割字符串的應用

分割字符的應用還是有不少地方的。剛好前兩天在ITPUB的論壇上看有人提問這樣的問題,把問題復制過來,如下:

有以下數據:

姓名 答案 開始題號 得分張一 D;C;A;B 11 5;0;3;1張二 F;A;C 13 6;0;2張三 G;H;K;D;G;B 6 8;4;1;2;3;5需求:根據姓名,在答案中根據分號相隔把答案 與得分對應分行,同一行根據開始題號逐號遞增。要得到結果:姓名 答案 題號 得分張一 D 11 5張一 C 12 0張一 A 13 3張一 B 14 1張二 F 13 6張二 A 14 0張二 C 15 2張三 G 6 8張三 H 7 4張三 K 8 1張三 D 9 2張三 G 10 3張三 B 11 5

先不管數據源為什么會這樣,現在只是想方法解決問題。如果要分割數據源中的“答案”和“得分”這兩個字段的字符串,可參考我之前發的文章(幾種分割字符串實現方法的比較),修改一下分割字符串函數即可滿足分割的要求。但是這里是多記錄的表,直接在SELECT語句上使用表值函數是不允許的。暫時想到有兩個方法,第一是使用游標,第二是使用循環。

首先是修改后的分割函數,代碼如下:

 1 IF OBJECT_ID(N'fn_split_with_rowno_set') IS NOT NULL 2 BEGIN 3     DROP FUNCTION fn_split_with_rowno_set 4 END 5 GO 6  7 CREATE FUNCTION fn_split_with_rowno_set 8 ( 9     @str       NVARCHAR(MAX)10    ,@split     NVARCHAR(20) = ','11    ,@row_no_start INT = 012 )13 RETURNS @t TABLE(row_no INT ,col NVARCHAR(500))14 AS15 BEGIN16     SET @row_no_start = ISNULL(@row_no_start,0) 17     WHILE (CHARINDEX(@split ,@str) <> 0)18     BEGIN19         INSERT @t (row_no,col)20         VALUES(@row_no_start,SUBSTRING(@str ,1 ,CHARINDEX(@split ,@str) -1))     21         SET @str = STUFF(@str ,1 ,CHARINDEX(@split ,@str) + LEN(@split) -1 ,'')22         SET @row_no_start = @row_no_start + 1 23     END  24     IF (@str <> '')25         INSERT @t (row_no,col)26         VALUES(@row_no_start ,@str)27     28     RETURN29 END30 GO

調用函數,測試下效果:

1 SELECT * FROM fn_split_with_rowno_set(N'123,abc,456,AAA,DDD,博客園',',',11)

結果如下:

然后是插入一些測試數據。

 1 IF OBJECT_ID(N'Tempdb..##STU_RESULT') IS NOT NULL 2 BEGIN 3     DROP TABLE ##STU_RESULT 4 END 5 GO 6  7 CREATE TABLE ##STU_RESULT ( 8     name NVARCHAR(200), 9     result NVARCHAR(MAX),10     no_start INT,11     score NVARCHAR(MAX)12 )13 GO14 15 INSERT INTO ##STU_RESULT (name, result, no_start, score)16 SELECT N'張一','D;C;A;B',11,'5;0;3;1'17 UNION ALL 18 SELECT N'張二','F;A;C',13,'6;0;2'19 UNION ALL 20 SELECT N'張三','G;H;K;D;G;B',6,'8;4;1;2;3;5'21 GO22 23 SELECT * FROM ##STU_RESULT24 25 GO

運行結果:

方法1,使用游標,把每一行(每個人)的一個或多個答案和得分分割,插入到一張臨時表中,或根據需要,直接更新到業務表中。

 1 --使用游標 2 IF OBJECT_ID(N'Tempdb..#T1') IS NOT NULL 3 BEGIN 4     DROP TABLE #T1 5 END 6 GO 7  8 CREATE TABLE #T1 ( 9     name NVARCHAR(200),10     result NVARCHAR(MAX),11     no_start INT,12     score NVARCHAR(MAX)13 )14 GO15 16 DECLARE @r NVARCHAR(MAX)17 DECLARE @s NVARCHAR(MAX)18 DECLARE @name NVARCHAR(200)19 DECLARE @no_start INT20 21 DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 22 SELECT name FROM ##STU_RESULT 23 GROUP BY name 24 25 OPEN cur26 FETCH NEXT FROM cur INTO @name27 28 WHILE @@FETCH_STATUS = 029 BEGIN30     SELECT @r = result,@no_start = no_start,@s = score  FROM ##STU_RESULT WHERE NAME = @name31     INSERT INTO #T1 (name,result,no_start,score)32     SELECT @name,a.col,a.row_no,b.col FROM fn_split_with_rowno_set(@r,';',@no_start) AS a 33     LEFT JOIN fn_split_with_rowno_set(@s,';',@no_start) AS b ON a.row_no = b.row_no34 FETCH NEXT FROM cur INTO @name35 END36 37 CLOSE cur38 DEALLOCATE cur39 40 SELECT * FROM #T141 GO

運行結果:

方法2,使用循環。

 1 --使用循環。 2 IF OBJECT_ID(N'Tempdb..#T3') IS NOT NULL 3 BEGIN 4     DROP TABLE #T3 5 END 6 GO 7  8 CREATE TABLE #T3 ( 9     name NVARCHAR(200),10     result NVARCHAR(MAX),11     no_start INT,12     score NVARCHAR(MAX)13 )14 GO15 16 IF OBJECT_ID(N'Tempdb..#T2') IS NOT NULL17 BEGIN18     DROP TABLE #T219 END20 GO21 22 CREATE TABLE #T2 (23     id_ INT,24     name NVARCHAR(200),25     result NVARCHAR(MAX),26     no_start INT,27     score NVARCHAR(MAX)28 )29 GO30 31 INSERT INTO #T2 (id_,name,result,no_start,score)32 SELECT ROW_NUMBER() OVER (ORDER BY name ASC),name,result,no_start,score FROM ##STU_RESULT33 --SELECT * FROM #T234 35 36 DECLARE @r NVARCHAR(MAX)37 DECLARE @s NVARCHAR(MAX)38 DECLARE @name NVARCHAR(200)39 DECLARE @no_start INT40 DECLARE @i INT41 DECLARE @j INT42 43 SET @i = 144 SELECT @j = MAX(id_) FROM #T245 46 BEGIN TRAN 47 WHILE @i <= @j 48 BEGIN49     SELECT @name=name,@r=result,@no_start=no_start,@s=score FROM #T2 WHERE id_=@i50     51     INSERT INTO #T3 (name,result,no_start,score)52     SELECT @name,a.col,a.row_no,b.col FROM fn_split_with_rowno_set(@r,';',@no_start) AS a 53     LEFT JOIN fn_split_with_rowno_set(@s,';',@no_start) AS b ON a.row_no=b.row_no54     55     SET @i = @i + 156 END57 COMMIT TRAN 58 59 SELECT * FROM #T360 GO

運行結果:

這兩個方法有什么區別?結果看起來沒什么區別,但是在我的筆記本上測試,源表插入10000條記錄,運行速度,循環比游標快了幾倍。至于張二為什么在張三后面,這可能是關乎于我的數據庫的Collation使用的是SQL_Latin1_General_CP1_CI_AS有關了。這個問題待我有空的時候研究下。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲国产一区| 中文字幕av一区二区| 精品久久久久久久大神国产| 欧美大尺度激情区在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲最大福利视频网| 久久精品色欧美aⅴ一区二区| 日韩午夜在线视频| 美女999久久久精品视频| 精品久久久中文| 国产精品精品一区二区三区午夜版| 亚洲伊人一本大道中文字幕| 国产免费一区二区三区在线能观看| 九九九久久国产免费| 国产69精品99久久久久久宅男| 亚洲无线码在线一区观看| 国产精品草莓在线免费观看| 亚洲欧美综合区自拍另类| 欧美亚洲视频在线观看| 久热国产精品视频| 国产精品久久久久久久久久ktv| 国产一区二区三区视频在线观看| 国产97在线|日韩| 国产精品麻豆va在线播放| 亚洲人a成www在线影院| 国产精品美女久久| 久久好看免费视频| 欧美性猛交视频| 国产拍精品一二三| 国产精品入口免费视频一| 亚洲午夜未删减在线观看| 久久久免费电影| 日韩电视剧免费观看网站| 欧美在线欧美在线| 国产精品久久久久7777婷婷| 日韩精品视频在线播放| 中文字幕亚洲欧美在线| 欧美亚洲视频在线观看| 高清欧美性猛交xxxx黑人猛交| 久久av资源网站| 一区二区国产精品视频| 国产精品一区二区三| 亚洲曰本av电影| 欧美性生活大片免费观看网址| 精品成人av一区| 久久久综合免费视频| 亚洲人成网站免费播放| 国产精品视频不卡| 亚洲欧美视频在线| 亚洲欧洲日韩国产| 中文字幕国产精品久久| 欧美亚洲国产视频| 亚洲免费影视第一页| 成人疯狂猛交xxx| 久久国产加勒比精品无码| 久久国产精品久久久久| 亚洲bt欧美bt日本bt| 91久久久久久久久久久久久| 国产成人精品视频在线| 亚洲xxxx18| 国产综合福利在线| 亚洲人成亚洲人成在线观看| 日韩国产欧美精品在线| 97av在线影院| 久久在线精品视频| 91网站在线免费观看| 91亚洲va在线va天堂va国| 色综合视频一区中文字幕| 97国产精品免费视频| 亚州av一区二区| 最近中文字幕mv在线一区二区三区四区| 这里只有精品丝袜| 国产精品综合久久久| 富二代精品短视频| 日韩免费在线视频| 欧美国产视频日韩| 亚洲偷欧美偷国内偷| 久久久精品国产亚洲| 欧美日韩中文字幕综合视频| 俺也去精品视频在线观看| 亚洲国产欧美久久| 亚洲人高潮女人毛茸茸| 成人444kkkk在线观看| 日本久久91av| 日韩精品中文字幕在线| 亚洲精品日韩欧美| 色香阁99久久精品久久久| 欧美激情一级欧美精品| 日本国产高清不卡| 波霸ol色综合久久| 日本最新高清不卡中文字幕| 日韩在线国产精品| 91久热免费在线视频| 96国产粉嫩美女| 国产日韩精品入口| 97人人爽人人喊人人模波多| 亚洲护士老师的毛茸茸最新章节| 中文字幕在线国产精品| 亚洲欧美日韩精品久久| 中国人与牲禽动交精品| 亚洲色图激情小说| 成人免费淫片视频软件| 狠狠做深爱婷婷久久综合一区| 国产三级精品网站| 狠狠躁夜夜躁人人爽超碰91| 亚洲天天在线日亚洲洲精| 成人欧美一区二区三区黑人| 两个人的视频www国产精品| 日本免费一区二区三区视频观看| 欧美日韩在线视频一区二区| 日韩高清电影免费观看完整版| 久久视频在线观看免费| 亚洲国产欧美在线成人app| 午夜精品久久17c| 成人免费看吃奶视频网站| 国产精品白丝av嫩草影院| 久久手机精品视频| 久久精品国产清自在天天线| 精品久久久久久久久久ntr影视| 亚洲欧美成人在线| 国产精品手机播放| 日本成人免费在线| 亚洲免费av电影| 国产精品福利片| 久久综合九色九九| 国产小视频国产精品| 欧美日韩美女视频| 91探花福利精品国产自产在线| 精品亚洲一区二区三区| 国产精品大陆在线观看| 欧美大尺度在线观看| 91在线观看免费高清完整版在线观看| 国内外成人免费激情在线视频网站| 91久久中文字幕| 91亚洲国产成人精品性色| 日韩欧美一区视频| 欧美一级大胆视频| 欧美韩国理论所午夜片917电影| 91天堂在线观看| 久久久久久久久电影| 日韩欧美在线视频日韩欧美在线视频| 在线国产精品播放| 日本一区二三区好的精华液| 精品亚洲男同gayvideo网站| 清纯唯美亚洲激情| 96精品视频在线| 国产精品一区二区性色av| 欧美日韩亚洲网| 国产日本欧美一区二区三区在线| 4p变态网欧美系列| 欧洲一区二区视频| 成人福利网站在线观看11| 日韩在线观看高清| 另类色图亚洲色图| 亚洲一区二区久久久久久久| 亚洲色图偷窥自拍| 国产在线精品一区免费香蕉| 亚洲美女在线看| 97人人爽人人喊人人模波多| 2019国产精品自在线拍国产不卡| 欧美精品一本久久男人的天堂| 欧美国产日韩免费| 国产综合在线视频| 日韩av一区二区在线|