在sql中将多列放入一列

时间:2014-12-18 15:10:54

标签: sql sql-server sql-server-2008 multiple-columns

我有一个表Employee,其中有几个字段,如FirstName,LastName,Email,.......。所以我想做的是在我的情况下,选择列是动态的

Declare @columnNeeded nvarchar(max)

示例一

Set @columnNeeded = 'FirstName,Email'
Select @columnNeeded from Employee 

示例二

Set @columnNeeded = 'FirstName,LastName'
Select @columnNeeded from Employee

这很简单,现在我想要的是,无论结果集中的列是什么,我都需要在一列中选择所有列作为逗号分隔字符串。我在mysql中看到了Group_Concat()但是不知道如何在sql中执行此操作。这可能吗?

2 个答案:

答案 0 :(得分:4)

您可以使用动态SQL执行此操作:

declare @sql nvarchar(max) = 'select @columns from Employee';
declare @columnNeeded nvarchar(max) = 'FirstName,Email';

set @sql = replace(@sql, '@columns', @columnNeeded);

exec sp_executesql @sql;

编辑:

如果您想将它们作为一列,您可以这样做:

declare @sql nvarchar(max) = 'select @columns from Employee';
declare @columnNeeded nvarchar(max) = 'FirstName,Email';

set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+');

exec sp_executesql @sql;

要输入类型安全,您可以转换列值:

declare @tmp nvarchar(4000) = 'cast(' +
                              replace(@columnNeeded, ',', ', nvarchar(4000)), cast(') +
                              ', nvarchar(4000))'
set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+');

如果按预期工作,则会将cast(<col> as nvarchar(4000))添加到列表中的每个列。

答案 1 :(得分:1)

您必须使用Dynamic SQL。由于您的表格中有Data types个不同,因此您可能必须convert columnsVarcharconcatenate将结果转换为单列。

DECLARE @sql  NVARCHAR(max),
        @cols NVARCHAR(max) ='FirstName,Email'

SELECT @cols = 'convert(varchar(100),'
           + Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),')

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

SET @sql ='select ' + @cols + ' from Employee '

--print @sql
EXEC Sp_executesql @sql; 

工作示例:

CREATE TABLE #test1([Key] INT,ID    INT,Value VARCHAR(2))

INSERT #test1
VALUES (1,1,'C' ),(2,1,'C' ),(3,1,'I' )

DECLARE @sql  NVARCHAR(max),
        @cols NVARCHAR(max) ='ID,Value'

SELECT @cols = 'convert(varchar(100),'
           + Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),')

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

SET @sql ='select ' + @cols + ' from #test1 '

EXEC Sp_executesql @sql;