sql server - SQL splitfunction reverse -
i trying make sql splitfunction works reverse. means input: 'test1,test2,test3,test4'
and output should be:
| id | value | | 1 | test4 | | 2 | test3 | | 3 | test2 | | 4 | test1 | i found forwardworking function don't know change make work reversed. have tried stuff doesn't work.
here original
create function [dbo].[splitstring] ( @inputstring varchar(8000), @delimiter char(1) ) returns table return ( split(startpos,endpos) as( select 0 startpos, charindex(@delimiter,@inputstring) endpos union select endpos+1, charindex(@delimiter,@inputstring,endpos+1) split endpos > 0 ) select 'id' = row_number() on (order (select 1)), 'value' = substring(@inputstring,startpos ,coalesce(nullif(endpos,0) ,len(@inputstring)+1)-startpos) split ) go with
select id, value dbo.splitstring('test1,test2,test3,test4', ','); you output.
select * [dbo].[udf-str-parse-8k-rev]('test1,test2,test3,test4',',') returns
retseq retval 1 test4 2 test3 3 test2 4 test1 the udf
create function [dbo].[udf-str-parse-8k-rev] (@string varchar(max),@delimiter varchar(25)) returns table return ( cte1(n) (select 1 (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n(n)), cte2(n) (select top (isnull(datalength(@string),0)) row_number() on (order (select null)) (select n=1 cte1 a,cte1 b,cte1 c,cte1 d) ), cte3(n) (select 1 union select t.n+datalength(@delimiter) cte2 t substring(@string,t.n,datalength(@delimiter)) = @delimiter), cte4(n,l) (select s.n,isnull(nullif(charindex(@delimiter,@string,s.n),0)-s.n,8000) cte3 s) select retseq = row_number() on (order a.n desc) ,retval = ltrim(rtrim(substring(@string, a.n, a.l))) cte4 ); --orginal source http://www.sqlservercentral.com/articles/tally+table/72993/ --select * [dbo].[udf-str-parse-8k-rev]('dog,cat,house,car',',') notice order in final select
Comments
Post a Comment