单表转换问题有答案,求解释!
之前有人在论坛上问题过这样一个问题。
Begin try
drop table #test
End try
Begin Catch
print '不存在#test'
End Catch
CREATE TABLE #test
(
ID UNIQUEIDENTIFIER,
NAME NVARCHAR(max),
SORTNO int
)
INSERT INTO #test
( ID, NAME, SORTNO )
VALUES ( NEWID(), -- ID - uniqueidentifier
N'aa,bb,cc,dd349', -- NAME - nvarchar(50)
1 -- SORTNO - int
)
INSERT INTO #test
( ID, NAME, SORTNO )
VALUES ( NEWID(), -- ID - uniqueidentifier
N'qqq,www,eee', -- NAME - nvarchar(50)
3 -- SORTNO - int
)
go
select * from #test ---原表
go
select id,
--name转换后的表,
SUBSTRING(t.name, number ,CHARINDEX(',',t.name+',',number)-number) as name,
SORTNO
from #test t,master..spt_values s
where s.number >=1
and s.type = 'P'
and SUBSTRING(','+t.name,s.number,1) = ','
go
select number from master..spt_values s where s.number >=1 ---系统数字列 1---2047
and s.type = 'P'
select CHARINDEX (',',name,0) from #test ---获取第一个 逗号位置
select SUBSTRING (name,0, CHARINDEX (',',name,0)) from #test ---获取第一个逗号前面的值
select CHARINDEX (',',name,CHARINDEX (',',name,0)+1) from #test ---获取第二个 逗号位置
select CHARINDEX (',',name,CHARINDEX (',',name,CHARINDEX (',',name,0)+1)+1) from #test ---获取第三个 逗号位置
---获取第n个 逗号位置怎么写?
[解决办法]
你可以拆来看看,比如使用select CHARINDEX(',',t.name+',',number)-number from #test,看看是什么结果,读代码很重要就是看结果
[解决办法]
SUBSTRING(t.name, number ,CHARINDEX(',',t.name+',',number)-number) as name
对于这一句中的number是表master..spt_values中的一个字段,在substring
函数中,表示从这个位开始,CHARINDEX(',',t.name+',',number)--这句就是从t.name的地number个字符开始
','所处的位数,后面的-number你应该该明白了吧