爆炸整数范围以加入SQL

Chr*_*oph 4 sql t-sql join sql-server-2008

我有一个表在一个字段中存储一系列整数,有点像打印范围,(例如"1-2,4-7,9-11").该字段还可以包含单个数字.

我的目标是将此表连接到具有离散值而不是范围的第二个表.

所以,如果第一表包含

1-2,5
9-15
7
Run Code Online (Sandbox Code Playgroud)

而表二包含

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

联接的结果将是

1-2,5   1
1-2,5   2
1-2,5   5
7       7
9-15    9
9-15    10
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2008 R2中工作.

Mik*_*son 7

使用您选择字符串拆分功能在逗号上拆分.找出最小/最大值并使用之间的连接.

SQL小提琴

MS SQL Server 2012架构设置:

create table T1(Col1 varchar(10))
create table T2(Col2 int)

insert into T1 values
('1-2,5'),
('9-15'),
('7')

insert into T2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
Run Code Online (Sandbox Code Playgroud)

查询1:

select T1.Col1,
       T2.Col2
from T2
  inner join (
              select T1.Col1,
                     cast(left(S.Item, charindex('-', S.Item+'-')-1) as int) MinValue,
                     cast(stuff(S.Item, 1, charindex('-', S.Item), '') as int) MaxValue
              from T1
                cross apply dbo.Split(T1.Col1, ',') as S
             ) as T1
    on T2.Col2 between T1.MinValue and T1.MaxValue
Run Code Online (Sandbox Code Playgroud)

结果:

|  COL1 | COL2 |
----------------
| 1-2,5 |    1 |
| 1-2,5 |    2 |
| 1-2,5 |    5 |
|  9-15 |    9 |
|  9-15 |   10 |
|     7 |    7 |
Run Code Online (Sandbox Code Playgroud)