SQL选择2个数字之间的Concat

时间:2015-08-12 09:30:55

标签: sql sql-server-2012 concatenation concat difference-between-rows

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

例如:

3 and 7 = 34567
or 1 and 4 = 1234
or 2 and 2 = 2

当我使用Concat函数时,我只能将第一个和最后一个数字连接起来。但我也需要两者之间的数字。

6 个答案:

答案 0 :(得分:3)

尝试此查询。这里firstcolumn = 3,secondcolumn = 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

答案 1 :(得分:2)

sql-server中有multiple ways to generate sequences。这是一个简单的,不需要数字表:

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

答案 2 :(得分:1)

这是一个递归查询,它将从头到尾递归并生成所需的字符串或INTEGER值:

DECLARE @start  INT = 3 
DECLARE @end    INT = 7
DECLARE @int_value  INT = 0
DECLARE @str_value  VARCHAR(100) = '';

WITH rec AS (
    SELECT @start AS val
    UNION ALL
    SELECT  val + 1
    FROM    rec 
    WHERE   val < @end
)
SELECT  @str_value = CONCAT(@str_value, val), 
        @int_value = @int_value * 10 + val
FROM    rec

SELECT  @str_value, @int_value

答案 3 :(得分:0)

这是Itzik的风格

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]

答案 4 :(得分:0)

使用SUBSTRING()函数(Fiddle example):

尝试此操作
--Declare sample table
DECLARE @T TABLE (id int identity, numCol1 int, numCol2 int)

--Add some values
INSERT @T (numCol1, numCol2)
VALUES (3, 7), (1, 4), (2, 2)

--Actual Query
SELECT *,  SUBSTRING('123456789', numCol1,  numCol2 - numCol1  + 1) Number
FROM @T

以上查询仅适用于单位数字。 Modified version(下方)使用34,78等数字

SELECT *,  
       SUBSTRING('123456789', CONVERT(int, LEFT(numCol1,1)), 
          CONVERT(int, RIGHT(numCol2, 1)) - convert(int, LEFT(numCol1,1))  + 1) YourNumber
FROM @T

注意:数字列返回string,可以使用int函数转换为convert()

答案 5 :(得分:0)

感谢您的回答。 我将使用@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天To = 1但List_Output是1234567