SQL Server中如何拼接多列并去除相邻重复值?
SQL Server 多列拼接并去除相邻重复值
针对你的需求,我们可以通过逐列判断当前列与前一列是否重复,只保留非重复的列值来实现目标效果。核心思路是用CASE语句对比相邻列,仅当当前列值与前一列不同(且非空)时,才将其加入拼接结果。
以下是适配你数据的SQL语句:
SELECT ISNULL(Tier1, '') + CASE WHEN ISNULL(Tier2, '') <> ISNULL(Tier1, '') THEN '|' + ISNULL(Tier2, '') ELSE '' END + CASE WHEN ISNULL(Tier3, '') <> ISNULL(Tier2, '') THEN '|' + ISNULL(Tier3, '') ELSE '' END + CASE WHEN ISNULL(Tier4, '') <> ISNULL(Tier3, '') THEN '|' + ISNULL(Tier4, '') ELSE '' END + CASE WHEN ISNULL(Tier5, '') <> ISNULL(Tier4, '') THEN '|' + ISNULL(Tier5, '') ELSE '' END + CASE WHEN ISNULL(Tier6, '') <> ISNULL(Tier5, '') THEN '|' + ISNULL(Tier6, '') ELSE '' END AS Result FROM table1
逻辑说明:
- 首先以
Tier1作为拼接起始值,用ISNULL处理空值,避免NULL破坏拼接结果。 - 后续每一列通过
CASE判断:如果当前列值(处理空值后)和前一列值不同,就追加|+当前列值;如果相同或为空,就追加空字符串跳过。 - 对应你提供的示例数据,Tier2-Tier4和Tier1重复,会被直接跳过;Tier5和Tier4不同,会追加
|Property;Tier6和Tier5重复,同样被跳过,最终得到Contract|Property的结果。
如果遇到中间列有空值但后续列有新值的场景,这个逻辑也能正常工作——空值会被自动跳过,后续的新值依然会被追加到结果中。
内容的提问来源于stack exchange,提问作者teburg1
相关产品推荐
相关产品推荐

