我使用SQL Server 2012,需要在两个不同的列之间进行连接。
例如:
3 and 7 = 34567
or 1 and 4 = 1234
or 2 and 2 = 2
当我使用Concat函数时,我只能将第一个和最后一个数字连接起来。但我也需要两者之间的数字。
答案 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