首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql中用多个分隔符(和-)分割数据和拥有自己的规则

在sql中用多个分隔符(和-)分割数据和拥有自己的规则
EN

Stack Overflow用户
提问于 2014-03-18 10:24:24
回答 5查看 14.4K关注 0票数 4

我有像这个1,2,3,4-8,10,11这样的数据

我希望用以下2条规则将数据分成几行:

  1. ,将只将数据拆分为行。Ex 1,2,3成为: 1 2 3
  2. -将分裂成系列编号。Ex 4-8成为: 4 5 6 7 8

SQL查询如何做到这一点?请回答并保持简单。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-18 13:16:50

只要您的间隔小于2048 (如果该数字还可以更高,请告诉我),只要您的数据间隔小于2048,您的@data就会遵循您当前的语法:

代码语言:javascript
复制
declare @data varchar(50) = '1,2,3,4-8,10,11'

;with x as
(
     SELECT t.c.value('.', 'VARCHAR(2000)') subrow
     FROM (
         SELECT x = CAST('<t>' + 
               REPLACE(@data, ',', '</t><t>') + '</t>' AS XML)
     ) a
     CROSS APPLY x.nodes('/t') t(c)
), y as
(
SELECT 
CAST(coalesce(PARSENAME(REPLACE(subrow, '-', '.'), 2),
              PARSENAME(REPLACE(subrow, '-', '.'), 1)) as int) f,
CAST(PARSENAME(REPLACE(subrow, '-', '.'), 1) as int) t from x
)
select z.number from y
cross apply 
(select y.f + number number
from master..spt_values
where number <= y.t - y.f and type = 'p'
) z

结果:

代码语言:javascript
复制
1
2
3
4
5
6
7
8
10
11
票数 4
EN

Stack Overflow用户

发布于 2016-08-30 07:30:33

代码语言:javascript
复制
CREATE FUNCTION dbo.MultipleDelemiterSplit
(
   @List       NVARCHAR(MAX),
   @Delemiter1 Varchar(100),
   @Delemiter2 Varchar(100)
)
RETURNS  TABLE
AS

   RETURN
   ( 
      SELECT Item = FirstSet.cnt.value('(./text())[1]', 'nvarchar(4000)')
      FROM
      (
        SELECT x = CONVERT(XML, '<cnt>'
          + REPLACE(REPLACE(@List, ISNULL(@Delemiter1,''), '</cnt><cnt>') , ISNULL(@Delemiter2,''), '</cnt><cnt>')
          + '</cnt>').query('.')
      ) AS a CROSS APPLY x.nodes('cnt') AS FirstSet(cnt)
   );

GO 

Select * From dbo.MultipleDelemiterSplit ('10:0,11:1,12:3,13:4,15:5,16:6',',',':')
票数 2
EN

Stack Overflow用户

发布于 2014-03-18 13:03:40

我刚刚为两个分隔符创建了一个示例,需要对泛型进行一些操作。

代码语言:javascript
复制
CREATE FUNCTION dbo.SplitStrings
(
   @List       NVARCHAR(MAX),
   @Separator1 Varchar(100),
   @Separator2 Varchar(100)
)
RETURNS  TABLE 
AS

   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(REPLACE(@List, ISNULL(@Separator1,''), '</i><i>') , ISNULL(@Separator2,''), '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );

GO  

Select * From dbo.SplitStrings ('1,2,3,4 5,6,7',',','-')

如果不需要第二个分隔符,只需传递空或空。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22476475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档