我使用的是SQL Server2008,在表中有一个列,其中的值如下所示。它基本上显示了出发和到达的信息。
-->希思罗/都柏林*都柏林/希思罗机场
-->盖特威克/利物浦*利物浦/卡莱尔*卡莱尔/盖特威克
-->希思罗机场/都柏林机场*利物浦/希思罗机场
(上面显示的第三个示例略有不同,其中此人不是从都柏林出发,而是从利物浦出发)。
这使得该列太长,我只想删除相邻的重复项,因此信息可以显示如下:
-->希思罗/都柏林/希思罗机场
-->盖特威克/利物浦/卡莱尔/盖特威克
-->希思罗机场/都柏林机场*利物浦/希思罗机场
因此,这仍然会显示正确的旅行路线,但只省略连续的重复项。此外,在第三种情况下,由于出发和到达信息位置不同,我希望将其显示为*。
我在这里找到了一个删除所有重复项(Find and Remove Repeated Substrings)的帖子,但这与我需要的解决方案略有不同。
有人能分享一下你的想法吗?
发布于 2015-01-30 01:57:47
第一步是调整以下链接中定义的流程,使其基于/拆分:
这将返回一个表,然后您将循环检查该值是否包含*。在这种情况下,您将获得*之前和之后的文本值,并对它们进行比较。使用CHARINDEX获取*的位置,使用SUBSTRING获取前后的值。完成后,请检查这两个值,并相应地附加到输出字符串中。
发布于 2015-01-30 05:37:01
因此,您有一个包含此文本字符串的数据库列?您关心的是以新格式向用户显示数据,还是用新值更新数据库表中的数据?
您是否有权访问构建此文本字符串的原始数据?以所需的格式重新创建字符串可能比以编程方式编辑现有字符串更容易。
如果您无法访问这些数据,那么如果您使用高级语言(如c#或java )进行字符串操作,那么更新数据(或重新格式化数据以显示)可能会简单得多。
如果要重新格式化字符串以进行显示,请在显示字符串之前,以任何合适的语言编写字符串操作代码。如果您正在更新表,您可以编写一个程序来处理该表,读取每条记录,构建替换字符串,并在进入下一条记录之前更新记录。
归根结底,T-SQL不是一种很好的语言,不适合进行这种字符串检查和操作。如果您可以从原始数据构建一个新的字符串,或者使用高级语言进行操作,那么您将可以更轻松地完成这项工作,并最终获得更易维护的代码。
发布于 2015-02-15 02:03:39
我为你给出的第一个例子写了一段代码。对于剩下的部分,你仍然需要改进它。
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)))),'***')
ENDhttps://stackoverflow.com/questions/28220458
复制相似问题