查询将字符串拆分为行

Nil*_*ils 0 sql t-sql split rows delimiter

我有一个看起来像这样的表:

ID    Value
1     1,10
2     7,9
Run Code Online (Sandbox Code Playgroud)

我希望我的结果看起来像这样:

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

我在两个2数字之间的范围之后,作为分隔符(在值中只能有一个分隔符)以及如何将其拆分为行.

Gor*_*off 5

将逗号分隔的数字拆分是此问题的一小部分.解析应该在应用程序中完成,范围存储在单独的列中.出于多个原因:将数字存储为字符串是个坏主意.在一列中存储两个属性是个坏主意.实际上,将未经过处理的用户输入存储在数据库中通常也是一个坏主意.

在任何情况下,生成数字列表的一种方法是使用递归CTE:

with t as (
      select t.*, cast(left(value, charindex(',', value) - 1) as int) as first,
             cast(substring(value, charindex(',', value) + 1, 100) as int) as last
      from table t
     ),
     cte as (
      select t.id, t.first as value, t.last
      from t
      union all
      select cte.id, cte.value + 1, cte.last
      from cte
      where cte.value < cte.last
     )
select id, value
from cte
order by id, value;
Run Code Online (Sandbox Code Playgroud)

MAXRECURSION如果范围真的很大,你可能需要摆弄它的价值.