SQL Server转换选择一个列并将其转换为字符串

edd*_* ed 21 sql sql-server string select

是否可以编写一个从表中选择列并将结果转换为字符串的语句?

理想情况下,我想要逗号分隔值.

例如,假设SELECT语句看起来像

SELECT column
FROM table
WHERE column<10
Run Code Online (Sandbox Code Playgroud)

结果是一个包含值的列

|column|
--------
|  1   |
|  3   |
|  5   |
|  9   |
Run Code Online (Sandbox Code Playgroud)

我希望结果是字符串"1,3,5,9"

Kaf*_*Kaf 53

你可以这样做:

小提琴演示

declare @results varchar(500)

select @results = coalesce(@results + ',', '') +  convert(varchar(12),col)
from t
order by col

select @results as results

| RESULTS |
-----------
| 1,3,5,9 |
Run Code Online (Sandbox Code Playgroud)

  • 此方法没有记录可以正常工作,而且经常不能正常工作。正如 Connect 站点的各种引用所示,http://stackoverflow.com/a/15163136/73226 (4认同)

And*_*mar 10

select  stuff(list,1,1,'')
from    (
        select  ',' + cast(col1 as varchar(16)) as [text()]
        from    YourTable
        for     xml path('')
        ) as Sub(list)
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle的例子.


小智 7

SQL Server 2017中有一种新方法:

SELECT STRING_AGG (column, ',') AS column FROM Table;

1,3,5,9为你生产


小智 5

SELECT  CAST(<COLUMN Name> AS VARCHAR(3)) + ','
FROM    <TABLE Name>
FOR     XML PATH('')
Run Code Online (Sandbox Code Playgroud)


Col*_*Mac 5

当前接受的答案不适用于多个分组。
\n当您需要对列行值的类别进行操作时,请尝试此操作。

\n\n

假设我有以下数据:

\n\n
+---------+-----------+\n| column1 |  column2  |\n+---------+-----------+\n| cat     | Felon     |\n| cat     | Purz      |\n| dog     | Fido      |\n| dog     | Beethoven |\n| dog     | Buddy     |\n| bird    | Tweety    |\n+---------+-----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想要这个作为我的输出:

\n\n
+------+----------------------+\n| type |        names         |\n+------+----------------------+\n| cat  | Felon,Purz           |\n| dog  | Fido,Beethoven,Buddy |\n| bird | Tweety               |\n+------+----------------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

(如果您遵循以下步骤:

\n\n
create table #column_to_list (column1 varchar(30), column2 varchar(30))\ninsert into #column_to_list\nvalues \n(\'cat\',\'Felon\'),\n(\'cat\',\'Purz\'),\n(\'dog\',\'Fido\'),\n(\'dog\',\'Beethoven\'),\n(\'dog\',\'Buddy\'),\n(\'bird\',\'Tweety\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

现在 \xe2\x80\x93 我不想 \xe2\x80\x99 不想了解所有语法,但正如你所看到的,这为我们完成了最初的技巧:

\n\n
select \',\' + cast(column2 as varchar(255)) as [text()]  \nfrom #column_to_list sub\nwhere column1 = \'dog\'\nfor xml path(\'\')\n--Using "as [text()]" here is specific to the \xe2\x80\x9cfor XML\xe2\x80\x9d line after our where clause and we can\xe2\x80\x99t give a name to our selection, hence the weird column_name\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
+------------------------------------------+\n| XML_F52E2B61-18A1-11d1-B105-00805F49916B |\n+------------------------------------------+\n| ,Fido,Beethoven,Buddy                    |\n+------------------------------------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以看到它\xe2\x80\x99s的限制,因为它只用于一个分组(其中column1 = \xe2\x80\x98dog\xe2\x80\x99)并且它在前面留下了一个逗号,另外它\xe2 \x80\x99s 的名字很奇怪。

\n\n

因此,首先让我们使用“stuff”函数处理前导逗号并将我们的列命名为 stuff_list:

\n\n
select stuff([list],1,1,\'\') as stuff_list\nfrom (select \',\' + cast(column2 as varchar(255)) as [text()]\n         from #column_to_list sub\n         where column1 = \'dog\'\n         for xml path(\'\')\n         ) sub_query([list]) \n--"sub_query([list])" just names our column as \'[list]\' so we can refer to it in the stuff function.  \n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
+----------------------+\n|      stuff_list      |\n+----------------------+\n| Fido,Beethoven,Buddy |\n+----------------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后让\xe2\x80\x99s将其混合到一个select语句中,注意对定义我们想要的column1的top_query别名的引用(在这里的第5行):

\n\n
select top_query.column1, \n          (select stuff([list],1,1,\'\') as stuff_list\n         from (select \',\' + cast(column2 as varchar(255)) as [text()]\n                  from #column_to_list sub\n                  where sub.column1 = top_query.column1\n                  for xml path(\'\')\n                  ) sub_query([list])\n              ) as pet_list\nfrom  #column_to_list top_query\ngroup by column1\norder by column1\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
+---------+----------------------+\n| column1 |       pet_list       |\n+---------+----------------------+\n| bird    | Tweety               |\n| cat     | Felon,Purz           |\n| dog     | Fido,Beethoven,Buddy |\n+---------+----------------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们\xe2\x80\x99就完成了。

\n\n

你可以在这里阅读更多:

\n\n\n