从 SQL 中的多列创建去重字符串

问题描述

我们有一个人力资源系统,其中人员被安排在多达 7 个不同的组织级别。每个级别都显示数据库中自己的列中(在 MS-sql 2017 上运行) 我想创建一个组织字符串,显示人员在组织中的位置。但是 HR 系统正在使用先前的值重复值列以填充所有列,因此如果我只是将这些值与这样的简单函数组合在一起,则字符串充满重复项,这样对字符串的使用者来说不是很有用:

SELECT [OrgLvl1] + ';' + [OrgLvl2] + ';' + [OrgLvl3] + ';' + [OrgLvl4] + ';' + [OrgLvl5] + ';' + [OrgLvl6] + ';' + [OrgLvl7] as 'OrgString'

数据样本可能如下所示:

    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|
    | OrgLvl1   | OrgLvl2   | OrgLvl3   | OrgLvl4   | OrgLvl5   | OrgLvl6   | OrgLvl7   |
    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 2ndLevel  | 5thLevel  | 6thLevel  | 7thLevel  |
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 4thLevel  | 5thLevel  | 6thLevel  | 6thLevel  |
    | 1stLevel  | 2ndLevel  | 2ndLevel  | 4thLevel  | 5thLevel  | 6thLevel  | 7thLevel  |
    |-----------+-----------+-----------+-----------+-----------+-----------+-----------|

我得到的结果是

   1stLevel;2ndLevel;2ndLevel;2ndLevel;5thLevel;6thLevel;7thLevel
   1stLevel;2ndLevel;2ndLevel;4thLevel;5thLevel;6thLevel;6thLevel
   1stLevel;2ndLevel;2ndLevel;4thLevel;5thLevel;6thLevel;7thLevel

我想要的结果是这样的:

    1stLevel;2ndLevel;5thLevel;6thLevel;7thLevel
    1stLevel;2ndLevel;4thLevel;5thLevel;6thLevel
    1stLevel;2ndLevel;4thLevel;5thLevel;6thLevel;7thLevel

所以我正在寻找一些方法来查看字符串中的前一个值并消除任何重复项。

更新:我用过这个:

IIF([OrgLvl2] != [OrgLvl1],[OrgLvl2] + ';','') +
IIF([OrgLvl3] != [OrgLvl2],[OrgLvl3] + ';','') +
IIF([OrgLvl4] != [OrgLvl3],[OrgLvl4] + ';','') +
IIF([OrgLvl5] != [OrgLvl4],[OrgLvl5] + ';','') +
IIF([OrgLvl6] != [OrgLvl5],[OrgLvl6] + ';','') +
IIF([OrgLvl7] != [OrgLvl6],[OrgLvl7] + ';','') AS 'OrgString'

解决方法

我使用 IIF 运算符找到了解决方案。

SELECT 
    IIF(LEFT(OrgLvl1,1) = 1,OrgLvl1 + '; ','') + 
    IIF(LEFT(OrgLvl2,1) = 2,OrgLvl2 + '; ','') +
    IIF(LEFT(OrgLvl3,1) = 3,OrgLvl3 + '; ','') +
    IIF(LEFT(OrgLvl4,1) = 4,OrgLvl4 + '; ','') +
    IIF(LEFT(OrgLvl5,1) = 5,OrgLvl5 + '; ','') +
    IIF(LEFT(OrgLvl6,1) = 6,OrgLvl6 + '; ','') +
    IIF(LEFT(OrgLvl7,1) = 7,OrgLvl7 + '; ','') AS 'OrgString'
FROM tableName

DB FIDDLE 上的演示

,

看前面的,你可以这样做:-

OrgLvl1 + ';' +
IIF(OrgLvl2 <> OrgLvl1,OrgLvl2 + ';','') +
IIF(OrgLvl3 <> OrgLvl2,OrgLvl3 + ';','') +
IIF(OrgLvl4 <> OrgLvl3,OrgLvl4 + ';','') + 
IIF(OrgLvl5 <> OrgLvl4,OrgLvl5 + ';','') +
IIF(OrgLvl6 <> OrgLvl5,OrgLvl6 + ';','') +
IIF(OrgLvl7 <> OrgLvl6,OrgLvl7 + ';','') 
AS 'OrgString'