0
A
回答
1
首先我们分裂的字符串,并创建R1和R2,然后我们采用一个特设理货表以填补这一空白
Declare @YourTable table (ID int,RangeString varchar(max))
Insert Into @YourTable values
(1,'1-5,6,7'),
(2,'25000-25010,10-15')
Select A.ID
,C.N
From @YourTable A
Cross Apply (
Select R1=cast(left(RetVal,charindex('-',RetVal+'-')-1) as int)
,R2=cast(case when charindex('-',RetVal)=0 then left(RetVal,charindex('-',RetVal+'-')-1) else replace(RetVal,left(RetVal,charindex('-',RetVal+'-')),'') end as int)
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(RangeString,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X
Cross Apply x.nodes('x') AS B(i)
) P
) B
Cross Apply (
Select Top (B.R2-B.R1+1) N=Row_Number() Over (Order By (Select null))+B.R1-1 From master..spt_values N1,master..spt_values N2
) C
返回
ID N
1 1
1 2
1 3
1 4
1 5
1 6
1 7
2 25000
2 25001
2 25002
2 25003
2 25004
2 25005
2 25006
2 25007
2 25008
2 25009
2 25010
2 10
2 11
2 12
2 13
2 14
2 15
编辑 - 使用UDF的清洁版
Select A.ID
,D.N
From @YourTable A
Cross Apply [dbo].[udf-Str-Parse](A.RangeString,',') B
Cross Apply (
Select R1=min(cast(RetVal as int))
,R2=max(cast(RetVal as int))
From [dbo].[udf-Str-Parse](B.RetVal,'-')
) C
Cross Apply (
Select Top (C.R2-C.R1+1) N=Row_Number() Over (Order By (Select null))+C.R1-1
From master..spt_values N1,master..spt_values N2
) D
的UDF如果有兴趣
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')
--Performance On a 5,000 random sample -8K 77.8ms, -1M 79ms (+1.16), -- 91.66ms (+13.8)
相关问题
- 1. SQL日期范围拆分
- 2. 将子范围拆分成子范围
- 3. 将列表拆分成字母范围
- 4. 基于分号将Varchar max字段拆分为多个列
- 5. 将整个散列范围拆分为n个相等的范围
- 6. 拆分多个数据范围多行
- 7. 在配置单元中将相等部分的数字范围拆分
- 8. 将日期范围拆分为几个月
- 9. 将不同的varchar数据从一列拆分为多个行
- 10. 日期范围拆分
- 11. 将数字范围比较为两个单元格值所定义的范围
- 12. 将CGPoint数字拆分为两个CGFloat
- 13. Oracle SQL按分隔符将单个行拆分为多个
- 14. 从给定范围拆分数组
- 15. Mysql的2个VARCHAR列数据范围
- 16. 将单个单元格范围更改为列范围
- 17. 将数字转换为数字范围?
- 18. 在Oracle中将varchar拆分为单独的列
- 19. 求和拆分范围在一个SQL查询
- 20. 用Haskell将数字拆分为数字
- 21. SQL Sting拆分为单列
- 22. rangeOfComposedCharacterSequencesForRange将0字符范围转换为1个字符范围
- 23. 将单个列拆分为多个列
- 24. 将日期范围拆分为相应的星期
- 25. 将单个Excel列拆分为两个单独的列,将值拆分?
- 26. Oracle PL/SQL将csv字符串拆分为n个部分
- 27. SQL将结果拆分为多个列
- 28. 将字段拆分为一个字段
- 29. C#拆分字符串 - 将字符串拆分为数组
- 30. 将列中的数字拆分为单独列中的数字
您可以发布任何到目前为止,你已经尝试并没有奏效? – gabe3886