【问题标题】:SQL Select Concat between 2 numbersSQL选择2个数字之间的Concat
【发布时间】:2015-08-12 09:30:54
【问题描述】:

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

例如:

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

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

【问题讨论】:

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


    【解决方案1】:

    试试这个查询。这里 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
    

    【讨论】:

    • 是的,我错过了他想将数字连接到单个 varchar 的部分。
    • 有点晚了,但是有一个简单的方法可以使用substring()函数。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      这是一个递归查询,它将从头到尾递归地生成您想要的字符串或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
      

      【讨论】:

        【解决方案4】:

        这是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]
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            使用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,可以使用convert() 函数转换为int

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-07-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多