从Microsoft SQL Server中的字符串中删除重复的相邻子字符串

时间:2015-01-29 17:05:42

标签: sql-server sql-server-2008 sql-server-2008-r2 user-defined-functions sql-function

我正在使用SQL Server 2008,我在表中有一个列,其值如下所示。它基本上显示了出发和到达信息。

- >希思罗/都柏林*都柏林/希思罗

- >盖特威克/利物浦*利物浦/卡莱尔*卡莱尔/盖特威克

- >希思罗/都柏林*利物浦/希思罗

(上面显示的第三个例子略有不同,这个人没有离开都柏林,而是离开了利物浦)。

这使得列太冗长,我想只删除相邻的重复项,因此信息可以如下所示:

- >希思罗/都柏林/希思罗

- >盖特威克/利物浦/卡莱尔/盖特威克

- >希思罗/都柏林***利物浦/希思罗

因此,这仍然会显示正确的旅行路线,但只省略了连续的重复路线。另外,在第3种情况下,由于出发和到达信息的位置不一样,我想把它显示为***。

我在这里发现了一条删除所有重复项(Find and Remove Repeated Substrings)的帖子,但这与我需要的解决方案略有不同。

有人可以分享任何想法吗?

3 个答案:

答案 0 :(得分:0)

第一步是调整以下链接中定义的流程,使其基于/:

进行拆分

T-SQL split string

这将返回一个表,然后您将循环检查该值是否包含*。在这种情况下,您将获得*之前和之后的文本值并进行比较。使用CHARINDEX获取*的位置,使用SUBSTRING获取前后的值。一旦你检查了这两个值并相应地附加到输出字符串。

答案 1 :(得分:0)

所以你有一个包含这个文本字符串的数据库列?您是否担心以新格式向用户显示数据,或者使用新值更新数据库表中的数据?

您是否可以访问构建此文本字符串的原始数据?以您想要的格式重新创建字符串可能比以编程方式编辑现有字符串更容易。

如果您无法访问此数据,那么如果您使用高级语言(例如{{}进行字符串操作,则更新数据(或重新格式化以显示数据)可能要简单得多。 1}}或c#

如果您要重新格式化它以进行显示,请在显示之前以适当的语言编写字符串操作代码。如果您正在更新表,则可以编写一个程序来处理表,读取每条记录,构建替换字符串以及更新记录,然后再转到下一个表。

最重要的是,T-SQL并不是进行此类字符串检查和操作的好语言。如果您可以从原始数据构建新的字符串,或者使用高级语言进行操作,那么您可以更轻松地完成它并最终获得更易于维护的代码。

答案 2 :(得分:0)

  

我为你给出的第一个例子写了一个代码。你还需要   改善其余部分...

DECLARE @STR VARCHAR(50)='Heathrow/Dublin*Dublin/Heathrow'

IF  (SELECT SUBSTRING(@STR,CHARINDEX('/',@STR)+1,CHARINDEX('*',@STR)-CHARINDEX('/',@STR)-1)) =

   (SELECT SUBSTRING(@STR,CHARINDEX('*',@STR)+1,LEN(SUBSTRING(@STR,CHARINDEX('/',@STR)+1,CHARINDEX('*',@STR)-CHARINDEX('/',@STR)-1))))  

   BEGIN
    SELECT STUFF(@STR,CHARINDEX('*',@STR),LEN(SUBSTRING(@STR,CHARINDEX('/',@STR)+1,CHARINDEX('*',@STR)-CHARINDEX('/',@STR)-1))+1,'')
END
ELSE
BEGIN
SELECT STUFF(@STR,CHARINDEX('*',@STR),LEN(SUBSTRING(@STR,CHARINDEX('*',@STR)+1,LEN(SUBSTRING(@STR,CHARINDEX('/',@STR)+1,CHARINDEX('*',@STR)-CHARINDEX('/',@STR)-1)))),'***')    
END