2015-11-20 117 views
2

我想要做的是將多個列組合成一個列。假設我有一張名爲Player的表格,此表格包含多列,例如name, team, goalie, left back, right back, center back , left midfield.... and description將列組合成一列SQL Server

description柱將包含name + team + left back,所以descriptionRonaldo - 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 

我怎樣才能得到它添加一個以上的位置,如果玩家有不止一個?

感謝

+0

你有沒有試過在你的情況下使用concat? – davejal

+0

@davejal - 組conconat不是sql server中的函數。 – Hogan

+0

什麼版本的sql server? –

回答

5
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 Server +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

+0

刪除尾部'-'? – Hogan

+0

@Hogan正在工作 –

+0

提示... STUFF()默認爲' - ' – Hogan

1

我不是的粉絲聲明,並傾向於避免他們,當我可以。你可以逃脫這樣的:

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之類的值只有「是」,「否」和NULL。

+0

我正在測試的東西,如果玩家不是任何這些類別,就像'防禦'會一起工作空字符串並返回空字符串? –

+0

它會返回NULL。這也假設至少有一個'是'會在那裏。但是,如果玩家沒有「是」值,則可以將STUFF包裝在ISNULL中以使其返回空字符串(或其他)。 –

+0

然後類似於我所做的。謝謝。 –