将列合并为一列 SQL 服务器

Combining columns into one column SQL Server

我想做的是将多列合并为一列。假设我有一个名为 Player 的 table,这个 table 包含多个列,例如 name, team, goalie, left back, right back, center back , left midfield.... and description

description 列将包含 name + team + left back,因此 description 将是 Ronaldo - Madrid - Forward。当一名球员只有一个位置时我可以填充描述栏,但不能超过一个位置?

我的SQL:

select 
    name, team, goalie,
    leftback, rightback, centerback,
    left midfield,
    ......,
    name + ' - ' + team + ' - '+ 
    CASE 
       WHEN goalie = 'yes' THEN 'Goalie' 
       WHEN leftback = 'yes' THEN 'Left Back'
       WHEN rightback = 'yes' THEN 'Right Back'
       WHEN centerback = 'yes' THEN 'Center Back'
       .......
    END AS Description
from 
    player

输出:

Ronaldo - Madrid - Forward

如果玩家有多个位置,我如何让它添加多个位置?

谢谢

select 
   name,
   team, 
   CASE WHEN goalie = 'yes'      THEN 'Goalie - '      ELSE '' END + 
   CASE WHEN leftback = 'yes'    THEN 'LeftBack - '    ELSE '' END + 
   CASE WHEN rightback = 'yes'   THEN 'RightBack - '   ELSE '' END + 
   CASE WHEN center back = 'yes' THEN 'Center Back - ' ELSE '' END AS Description

并且您必须删除描述中的最后一个 -

SQL 服务器的版本 +2012

WITH cte as (
   SELECT
      name,
      team, 
      IIF(goalie = 'yes',      'Goalie - ', '') + 
      IIF(leftback = 'yes',    'LeftBack - ', '') + 
      IIF(rightback = 'yes',   'RightBack - ', '') + 
      IIF(center back = 'yes', 'Center Back - ', '') AS Description
   FROM Players
)
SELECT name,
       team,
       CASE LEN(Description) 
          WHEN 0 THEN Description 
          ELSE LEFT(Description, LEN(Description) - 3)
       END
FROM cte

使用STUFF

检查版本的评论

我不喜欢 CASE 语句,并且希望尽可能避免使用它们。你可以逃脱这样的事情:

select stuff (
              isnull(replace(replace(goalie,'no',''),'yes',' - Goalie'),'')
            + isnull(replace(replace(leftback,'no',''),'yes',' - Leftback'),'')
            + isnull(replace(replace(rightback,'no',''),'yes',' - Rightback'),'')
              ....
              ,1,3,''
             ) as 'Description'
  from Player

如果 goalie 等的唯一值是 'yes'、'no' 和 NULL。