日期:2014-05-17 浏览次数:20660 次
--测试环境
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b
SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','
--最后一个查询不是很理解
SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','
--where后面条件比较巧妙,取得A表中value存在','所有B.id值,以此明确
--value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)这---一句截取字符串时起始和结束位置
------解决方案--------------------
这是利用数字辅助表对数据进行拆分,建议你:看不懂的时候将代码里面的各个表达式分别select出来
化简这个句子 例如
SELECT A.id,CHARINDEX(',', A.[value] + ',', B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','
/*
id
----------- -----------
1 3
1 6
2 4
2 8
2 12
--可以看到3、6分别是第一个值的“,”位置和末尾位置(因为他在字符串末尾也加了一个“,”号)
4,8,12分别是第二个值的“,”位置
(5 行受影响)
*/
------解决方案--------------------
用临时表连接的方法,找到逗号在哪个位置上,然后拆分.
------解决方案--------------------
就是找到位置,然后截取。。。。。