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)
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)
小智 5
SELECT CAST(<COLUMN Name> AS VARCHAR(3)) + ','
FROM <TABLE Name>
FOR XML PATH('')
Run Code Online (Sandbox Code Playgroud)
当前接受的答案不适用于多个分组。
\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+---------+-----------+\nRun 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+------+----------------------+\nRun Code Online (Sandbox Code Playgroud)\n\n(如果您遵循以下步骤:
\n\ncreate 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\')\nRun Code Online (Sandbox Code Playgroud)\n\n)
\n\n现在 \xe2\x80\x93 我不想 \xe2\x80\x99 不想了解所有语法,但正如你所看到的,这为我们完成了最初的技巧:
\n\nselect \',\' + 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\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n+------------------------------------------+\n| XML_F52E2B61-18A1-11d1-B105-00805F49916B |\n+------------------------------------------+\n| ,Fido,Beethoven,Buddy |\n+------------------------------------------+\nRun 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\nselect 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. \nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n+----------------------+\n| stuff_list |\n+----------------------+\n| Fido,Beethoven,Buddy |\n+----------------------+\nRun Code Online (Sandbox Code Playgroud)\n\n最后让\xe2\x80\x99s将其混合到一个select语句中,注意对定义我们想要的column1的top_query别名的引用(在这里的第5行):
\n\nselect 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\nRun 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+---------+----------------------+\nRun Code Online (Sandbox Code Playgroud)\n\n我们\xe2\x80\x99就完成了。
\n\n你可以在这里阅读更多:
\n\n| 归档时间: |
|
| 查看次数: |
88807 次 |
| 最近记录: |