资源描述:
《字符串合并与拆分写法小结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、字符串合并与拆分写法小结 一.字符合并?1234567891011121314ifOBJECT_ID('ConcatStr')isnotnulldroptableConcatStrGOcreatetableConcatStr(IDint,Codevarchar(10))GOinsertintoConcatStrselect1,'XXX'unionallselect1,'YYY'unionallselect2,'PPP'unionallselect2,'QQQ' 要得到这样的结果: ?123IDCode1XXX,YYY2PPP,QQQ
2、1.用游标 ?123456789declare@ttable(IDint,Codevarchar(1000))declare@idintdeclareccursorforselectdistinctIDfromConcatStropencfetchnextfromcinto@idwhile@@fetch_status=0begindeclare@strvarchar(max)101112131415161718set@str=''select@str=@str+','+CodefromConcatStrwhereID=@idinserti
3、nto@t(ID,Code)select@id,stuff(@str,1,1,'')fetchnextfromcinto@idendclosecdeallocatecselect*from@t 2.用自定义函数 跟游标的方法类似,只是把逐个取的动作封装到函数里去了。(1)函数方法1 ?12345678910111213ifOBJECT_ID('f_concat_str')isnotnulldropfunctionf_concat_strGOcreatefunctionf_concat_str(@idint)returnsnvarcha
4、r(4000)asbegindeclare@snvarchar(4000)set@s=''select@s=@s+','+CodefromConcatStrwhereID=@idreturn(stuff(@s,1,1,''))--return(right(@s,len(@s)-1))End (2)函数方法2,就是把函数1再简化 ?1234ifOBJECT_ID('f_concat_str')isnotnulldropfunctionf_concat_strGOcreatefunctionf_concat_str(@idint)5678
5、91011121314returnsnvarchar(4000)asbegindeclare@snvarchar(4000)--set@s=''--select@s=casewhen@s=''thenCodeelse@s+','+Codeend--fromConcatStrwhereID=@idselect@s=isnull(@s+',','')+CodefromConcatStrwhereID=@idreturn@send 调用函数1或者函数2 ?12345--selectID,dbo.f_concat_str(ID)asCode-
6、-fromConcatStr--groupbyIDSelectdistinctID,Code=dbo.f_concat_str(ID)fromConcatStr 3.利用静态的行列转换写法 给分组里的每行构造一个编号,行列转换后把列连接起来,编号多少个,取决于每个分组COUNT(1)的值。 ?12345678910SELECTID, MAX(CASEWHENnum=1THENCodeELSE''END) +MAX(CASEWHENnum=2THEN','+CodeELSE''END)ASCodeFROM(SELEC
7、TID,Code, (SELECTCOUNT(*) FROMdbo.ConcatStrASt2 WHEREt2.ID=t1.ID ANDt2.Code<=t1.Code)ASnumFROMdbo.ConcatStrASt1)AStGROUPBYID; 4.用FORXML子句 (1)FORXMLAUTOSQLServer2000就有这个子句,不过OUTERAPPLY是SQLServer2005的语法。通常这种写法效率上不会比用函数快。 ?12SELECT*FROM(SELECTD
8、ISTINCTIDFROMConcatStr)AOUTERAPPLY(SELECTCode=STUFF(REPLACE(REPLACE((SELECTCodeFROMConcatStrNWHE