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

Sql server 从Microsoft SQL Server中的字符串中删除重复的相邻子字符串,sql-server,sql-server-2008,sql-server-2008-r2,user-defined-functions,sql-function,Sql Server,Sql Server 2008,Sql Server 2008 R2,User Defined Functions,Sql Function,我使用的是SQLServer2008,表中有一列,其值如下所示。它基本上显示出发和到达信息 -->希思罗机场/都柏林*都柏林机场/希思罗机场 -->盖特威克/利物浦*利物浦/卡莱尔*卡莱尔/盖特威克 -->希思罗/都柏林*利物浦/希思罗 (上文所示的第三个例子略有不同,此人没有离开都柏林,而是离开了利物浦) 这使得列太长,我只想删除相邻的重复项,因此信息可以如下所示: -->希思罗机场/都柏林/希思罗机场 -->盖特威克/利物浦/卡莱尔/盖特威克 -->希思罗机场/都柏林***利物浦/希思罗机场

我使用的是SQLServer2008,表中有一列,其值如下所示。它基本上显示出发和到达信息

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

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

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

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

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

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

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

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

因此,这仍然会显示正确的旅行路线,但只会忽略连续的重复项。另外,在第三种情况下,由于出发和到达信息位置不同,我想将其显示为***

我在这里找到了一篇文章,其中删除了所有重复项(),但这与我需要的解决方案略有不同


有人能分享一下想法吗?

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


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

那么您有一个包含此文本字符串的数据库列了吗?您关心的是以新格式向用户显示数据,还是使用新值更新数据库表中的数据

您有权访问生成此文本字符串的原始数据吗?以所需格式重新创建字符串可能比以编程方式编辑现有字符串更容易

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

如果要将其重新格式化以供显示,请在显示之前用任何合适的语言编写字符串操作代码。如果要更新表,可以编写一个程序来处理该表,读取每条记录,生成替换字符串,并在继续下一条记录之前更新该记录

归根结底,T-SQL不是进行这种字符串检查和操作的好语言。如果您可以从原始数据构建一个新的字符串,或者使用高级语言进行操作,那么您的操作会更轻松,最终得到更易于维护的代码

我为您给出的第一个示例编写了一个代码。你还需要 为其他人改进它

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