单表转换问题有答案,求解释!

霜寒月冷 2013-12-10 10:25:54

之前有人在论坛上问题过这样一个问题。


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个 逗号位置怎么写?





SUBSTRING(t.name, number ,CHARINDEX(',',t.name+',',number)-number) as name --这一句 substring 函数我会用,但这一句我不理解,求解释?
...全文
91 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 楼主 chz415767975 的回复:
之前有人在论坛上问题过这样一个问题。

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个 逗号位置怎么写?
                                                                                                
                                                                                                

                                                                                                
SUBSTRING(t.name, number ,CHARINDEX(',',t.name+',',number)-number) as name --这一句 substring 函数我会用,但这一句我不理解,求解释?
这个其实就是利用系统自带的表来拆分字符串
  • 打赏
  • 举报
回复
SUBSTRING(t.name, number ,CHARINDEX(',',t.name+',',number)-number) as name

对于这一句中的number是表master..spt_values中的一个字段,在substring
函数中,表示从这个位开始,CHARINDEX(',',t.name+',',number)--这句就是从t.name的地number个字符开始
','所处的位数,后面的-number你应该该明白了吧
發糞塗牆 2013-12-10
  • 打赏
  • 举报
回复
你可以拆来看看,比如使用select CHARINDEX(',',t.name+',',number)-number from #test,看看是什么结果,读代码很重要就是看结果

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧