SQL选择2个数字之间的Concat

SQL选择2个数字之间的Concat,sql,sql-server-2012,concatenation,concat,difference-between-rows,Sql,Sql Server 2012,Concatenation,Concat,Difference Between Rows,我使用SQL Server 2012,需要在两个不同的列之间连接 例如: 当我使用Concat函数时,我只能够计算出第一个和最后一个数字。但是我也需要两者之间的数字。sql server中有。下面是一个不需要数字表的简单示例: WITH Numbers AS ( SELECT TOP (2000) n = ROW_NUMBER() OVER (ORDER BY object_id) FROM sys.all_objects ORDER BY n ) SELECT n FROM

我使用SQL Server 2012,需要在两个不同的列之间连接

例如:

当我使用Concat函数时,我只能够计算出第一个和最后一个数字。但是我也需要两者之间的数字。

sql server中有。下面是一个不需要数字表的简单示例:

WITH Numbers AS
(
    SELECT TOP (2000) n = ROW_NUMBER() OVER (ORDER BY object_id) 
    FROM sys.all_objects ORDER BY n
)
SELECT n FROM Numbers 
WHERE n BETWEEN 3 AND 7
在sql server中有两种类型。下面是一个不需要数字表的简单示例:

WITH Numbers AS
(
    SELECT TOP (2000) n = ROW_NUMBER() OVER (ORDER BY object_id) 
    FROM sys.all_objects ORDER BY n
)
SELECT n FROM Numbers 
WHERE n BETWEEN 3 AND 7

下面是一个递归查询,它将以递归方式从头到尾执行,并生成所需的字符串或整数值:


下面是一个递归查询,它将以递归方式从头到尾执行,并生成所需的字符串或整数值:


尝试此查询。这里第一列=3,第二列=7

SELECT t.Id, 
       ,STUFF((SELECT '' + CAST( n AS VARCHAR(50)) [text()]
         FROM (SELECT DISTINCT n = number 
                FROM master..[spt_values] 
                WHERE number >= firstcolumn AND number <= secondcolumn
                )a
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,0,'') List_Output
FROM tablename t

尝试此查询。这里第一列=3,第二列=7

SELECT t.Id, 
       ,STUFF((SELECT '' + CAST( n AS VARCHAR(50)) [text()]
         FROM (SELECT DISTINCT n = number 
                FROM master..[spt_values] 
                WHERE number >= firstcolumn AND number <= secondcolumn
                )a
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,0,'') List_Output
FROM tablename t
这是伊兹克的风格

declare @values varchar(100)='', @from int, @to int
select @from=3, @to=7
;WITH 
   n0 AS (SELECT 0 AS number UNION ALL SELECT 0), 
   n1 AS (SELECT 0 AS number FROM n0 AS a CROSS JOIN n0 AS b),
   n2 AS (SELECT 0 AS number FROM n1 AS a CROSS JOIN n1 AS b),
   n3 AS (SELECT 0 AS number FROM n2 AS a CROSS JOIN n2 AS b)

   select @values=@values+ltrim(sno) from 
   (select row_number() over (order by number) as sno from n3) as t
   where sno between @from and @to 
   select @values as [values]
这是伊兹克的风格

declare @values varchar(100)='', @from int, @to int
select @from=3, @to=7
;WITH 
   n0 AS (SELECT 0 AS number UNION ALL SELECT 0), 
   n1 AS (SELECT 0 AS number FROM n0 AS a CROSS JOIN n0 AS b),
   n2 AS (SELECT 0 AS number FROM n1 AS a CROSS JOIN n1 AS b),
   n3 AS (SELECT 0 AS number FROM n2 AS a CROSS JOIN n2 AS b)

   select @values=@values+ltrim(sno) from 
   (select row_number() over (order by number) as sno from n3) as t
   where sno between @from and @to 
   select @values as [values]
使用子字符串函数尝试此操作:

以上查询仅适用于单个数字。下面是使用34、78之类的数字

SELECT *,  
       SUBSTRING('123456789', CONVERT(int, LEFT(numCol1,1)), 
          CONVERT(int, RIGHT(numCol2, 1)) - convert(int, LEFT(numCol1,1))  + 1) YourNumber
FROM @T
注意:数字列返回字符串,可以使用转换函数将其转换为整数

以上查询仅适用于单个数字。下面是使用34、78之类的数字

SELECT *,  
       SUBSTRING('123456789', CONVERT(int, LEFT(numCol1,1)), 
          CONVERT(int, RIGHT(numCol2, 1)) - convert(int, LEFT(numCol1,1))  + 1) YourNumber
FROM @T
注意:数字列返回字符串,可以使用转换函数将其转换为整数。谢谢您的回答。 我将使用@Mukesh Kalgude的答案。 因此,我的完整查询如下:

select 
DayFrom,DayTo,
STUFF((SELECT TOP 7'' + CAST( n AS VARCHAR(50)) [text()]
         FROM (SELECT DISTINCT n = number 
                FROM master..[spt_values] 
                WHERE number >= DayFrom AND DayTo <= 7
                )a
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,0,'') List_Output
from SwitchProfilePairs
结果是 dayFrom=1 day To=1,但列表输出为1234567,谢谢您的回答。 我将使用@Mukesh Kalgude的答案。 因此,我的完整查询如下:

select 
DayFrom,DayTo,
STUFF((SELECT TOP 7'' + CAST( n AS VARCHAR(50)) [text()]
         FROM (SELECT DISTINCT n = number 
                FROM master..[spt_values] 
                WHERE number >= DayFrom AND DayTo <= 7
                )a
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,0,'') List_Output
from SwitchProfilePairs
结果是
dayFrom=1 day To=1但是列表输出是1234567

是的,我错过了他想要将数字连接到单个varchar的部分。有点晚了,但是有一种简单的方法可以使用子字符串函数完成。是的,我错过了他想要将数字连接到单个varchar的部分。有点晚了,但有一种简单的方法可以使用子字符串函数来实现。