SQL 2005溢用之:分拆列值
【IT168技术文档】
有表tb,如下:
| id | values |
| 1 | aa,bb |
| 2 | aaa,bbb,ccc |
| id | value |
| 1 | aa |
| 1 | bb |
| 2 | aaa |
| 2 | bbb |
| 2 | ccc |
SELECT TOP 8000 id = IDENTITY(int,1,1) INTO # FROM syscolumns a, syscolumns b SELECT A.id,SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id) FROM tb A, # B WHERE SUBSTRING(',' + A.[values], B.id, 1) = ',' DROP TABLE #
在SQL2005中,借用xml,可以简单地一句来实现这个功能
示例数据
DECLARE @t TABLE(id int, [values] varchar(100)) INSERT @t SELECT 1, 'aa,bb' UNION ALL SELECT 2, 'aaa,bbb,ccc'
查询处理
SELECT A.id,B.value FROM( SELECT id,[values] = CONVERT(xml, '<root><v>' + REPLACE([values],',','</v><v>') + '</v></root>') FROM @t )A OUTER APPLY( SELECT value = N.v.value('.', 'varchar(100)') FROM A.[values].nodes('/root/v') N(v) )B
结果:
| id | value |
| 1 | aa |
| 1 | bb |
| 2 | aaa |
| 2 | bbb |
| 2 | ccc |
(5 行受影响)
0
相关文章