微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server-获取以逗号分隔的具有值的列名

如何解决SQL Server-获取以逗号分隔的具有值的列名

我有一个包含多个列的表(下面的示例)

|Customer Id| Attr1 | Attr2 | Attr3 | Attr4 | Attr5 | Attr6 |
|1          | 1     | 0     | 0     | 1     | 0     | 1     |
|2          | 1     | 0     | 1     | 0     | 0     | 0     |
|3          | 0     | 1     | 0     | 1     | 1     | 0     |

我想获取所有客户以及该客户具有任何价值的属性

|Customer Id| Vals                |
|1          | Attr1,Attr4,Attr6 |
|2          | Attr1,Attr3        |
|3          | Attr2,Attr5 |

注意:列名是已知的,我不寻找动态查询。还查询sql Server 2012

解决方法

一种方法是使用CONCAT_WS和一些CASE表达式:

SELECT YT.CustomerID,CONCAT_WS(',',CASE Attr1 WHEN 1 THEN 'Attr1' END,CASE Attr2 WHEN 1 THEN 'Attr2' END,CASE Attr3 WHEN 1 THEN 'Attr3' END,CASE Attr4 WHEN 1 THEN 'Attr4' END,CASE Attr5 WHEN 1 THEN 'Attr5' END,CASE Attr6 WHEN 1 THEN 'Attr6' END) AS Vals
FROM dbo.YourTable;

似乎OP没有使用SQL Server的最新版本,因此他们将需要在STUFF上使用更旧的方法:

SELECT YT.CustomerID,STUFF(CONCAT(',' + CASE Attr1 WHEN 1 THEN 'Attr1' END,' + CASE Attr2 WHEN 1 THEN 'Attr2' END,' + CASE Attr3 WHEN 1 THEN 'Attr3' END,' + CASE Attr4 WHEN 1 THEN 'Attr4' END,' + CASE Attr5 WHEN 1 THEN 'Attr5' END,' + CASE Attr6 WHEN 1 THEN 'Attr6' END),1,'') AS Vals
FROM dbo.YourTable;
,

您可以使用:

select YT.CustomerId,stuff( (case when attr1 = 1 then ',Attr1' else '' end) +
              (case when attr1 = 2 then ',Attr2' else '' end) +
              (case when attr1 = 3 then ',Attr3' else '' end) +
              (case when attr1 = 4 then ',Attr4' else '' end) +
              (case when attr1 = 5 then ',Attr5' else '' end) +
              (case when attr1 = 6 then ',Attr6' else '' end),2,''
             )
from t;

SQL Server的最新版本支持concat_ws(),在这种情况下非常方便。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。