【发布时间】:2019-10-07 10:14:02
【问题描述】:
我想用一个分隔符和一些前缀来聚合单列值。 以下是尝试过的代码。
SELECT concat('TNB/IAG/',STRING_AGG(WF_ValStr, '/')) AS Result
FROM wfattrdata where wf_id=35262472 and WF_AttrID in (28,29,30,31,33);
我可以在最新的 MSSql 版本中得到以下预期结果。
TNB/IAG/1/2/3/4/5
如何替换上述查询以使其在 SQL Server 2016 中工作?
【问题讨论】:
-
有 很多 个重复的问题展示了如何使用 XML 或自定义 SQLCLR 函数的技巧。他们都以一种或另一种方式描述了 Aaron Bertrand 的 Grouped Concatenation in SQL Server 中的一种技术。
-
另一方面,将属性值存储在单独的行中实际上是一个设计问题。您失去了轻松查询数据的能力,而不是灵活性,最终导致性能不佳。 SQL Server 通过稀疏列支持数千列。您可以轻松地使用 XML 或 JSON 存储半结构化数据,对其进行索引和快速查询。
-
@PanagiotisKanavos 我不想使用函数并试图只聚合一列。您分享的页面是根据 id 和 values 连接两列。
-
相反,它描述了如何聚合列。正是 STRING_AGG 的作用。事实上,如果没有
STRING_AGG,尝试聚合多个列是一件非常痛苦的事情 -
例如检查刚刚发布的答案。这是 Aaron Bertrand 的文章中描述的
XML PATH技术。这一点我怎么强调都不过分——你会发现所有的答案都来自这篇文章
标签: sql-server tsql sql-server-2016 string-aggregation