按顺序连接字段-SQL Server

按顺序连接字段-SQL Server,sql,sql-server,Sql,Sql Server,我有一个由5个整数ID组成的表,我想添加一个列,它接受这些ID,对它们进行排序,并以类似于下面的方式连接它们 id1 id2 id3 id4 id5 new_col 364 53 468 184 469 /53/184/364/468/469/ 48 47 49 364 266 /47/48/49/266/364/ 是否

我有一个由5个整数ID组成的表,我想添加一个列,它接受这些ID,对它们进行排序,并以类似于下面的方式连接它们

id1       id2       id3      id4       id5      new_col
364       53        468      184       469      /53/184/364/468/469/
48        47        49       364       266      /47/48/49/266/364/

是否有一个功能可以使订购更快更容易?如果我必须手工编写排序代码,那就不可能了。

这在SQL Server中是一个真正的难题。这里有一种方法:

select t.*, v.ids
from t outer apply
     (select ('/' + max(case when seqnum = 1 then id end) +
              '/' + max(case when seqnum = 2 then id end) +
              '/' + max(case when seqnum = 3 then id end) +
              '/' + max(case when seqnum = 4 then id end) +
              '/' + max(case when seqnum = 5 then id end) +
              '/') as ids
      from (select id, row_number() over (order by id) as seqnum
            from (values(id1), (id2), (id3), (id4), (id5)) v(id)
           ) v
     ) v;

您还可以使用
XML路径
()


我希望实表中已经有一些
id

declare @data table (c1 int, c2 int, c3 int, c4 int, c5 int)

insert into @data (c1, c2, c3, c4, c5)
values
(364, 53, 468, 184, 469),
(48, 47, 49, 364, 266)


;with NumberedRows as
(
  select
    d.c1, d.c2, d.c3, d.c4, d.c5, 
    row_number() over(order by (select 1)) rn
  from @data d
)
select
  rn, r.c1, r.c2, r.c3, r.c4, r.c5,
  stuff(
    (
      select concat('/', p.num)
      from 
      (
        select rr.c1, rr.c2, rr.c3, rr.c4, rr.c5
        from NumberedRows rr
        where rr.rn = r.rn
      ) rr
      unpivot (num for cols in (c1, c2, c3, c4, c5)) p
      order by p.num
      for xml path(''), type
    ).value('.', 'varchar(max)')
  , 1, 1, '') value_list
from NumberedRows r
order by r.rn


看看@Martin和@Gordon的
VALUES(),()
trick看起来有多复杂。是的。

如果您在多个不同的列中存储相同的“类型”数据,那么您已经错过了关系数据库的要点。如果数据完全相同,则应将其存储为多行(和一列)。如果这些列的顺序很重要(1-5个值),那么应该将其建模为数据而不是元数据。行上是否有实际的标识符?如果是这样的话,unpivot解决方案将变得简单得多…@BenThul我怀疑它会更简单。你想要什么代码?我更喜欢你的unpivot解决方案。但仍然不喜欢这种数据模型。:)多么漂亮的假乌皮沃特!从MSSQLS2008开始提供,但这是我第一次看到这个技巧。感觉好像我什么都不知道)谢谢@IvanStarostin在2005年,您可以对派生表和
UNION ALL
btw执行相同的操作
declare @data table (c1 int, c2 int, c3 int, c4 int, c5 int)

insert into @data (c1, c2, c3, c4, c5)
values
(364, 53, 468, 184, 469),
(48, 47, 49, 364, 266)


;with NumberedRows as
(
  select
    d.c1, d.c2, d.c3, d.c4, d.c5, 
    row_number() over(order by (select 1)) rn
  from @data d
)
select
  rn, r.c1, r.c2, r.c3, r.c4, r.c5,
  stuff(
    (
      select concat('/', p.num)
      from 
      (
        select rr.c1, rr.c2, rr.c3, rr.c4, rr.c5
        from NumberedRows rr
        where rr.rn = r.rn
      ) rr
      unpivot (num for cols in (c1, c2, c3, c4, c5)) p
      order by p.num
      for xml path(''), type
    ).value('.', 'varchar(max)')
  , 1, 1, '') value_list
from NumberedRows r
order by r.rn