Удалить дубликат смежной подстроки из строки в Microsoft SQL Server

Я использую SQL Server 2008 и у меня есть столбец в таблице, который имеет значения, как показано ниже. Это в основном показывает информацию об отправлении и прибытии.

->Heathrow/ Дублин Дублин * /Heathrow

-> Гатвик / Ливерпуль * Ливерпуль / Карлайл * Карлайл / Гатвик

->Heathrow/ Дублин * Ливерпуль /Heathrow

(3-й пример, показанный выше, немного отличается, когда человек не уехал из Дублина, а уехал из Ливерпуля).

Это делает столбец слишком длинным, и я хочу удалить только смежные дубликаты, поэтому информацию можно показать, как показано ниже:

->Heathrow/ Дублин / Хитроу

->Gatwick/ Ливерпуль /Carlisle/Gatwick

->Heathrow/ Дублин *** Ливерпуль /Heathrow

Таким образом, это все еще показывает правильный маршрут путешествия, но пропускает только смежные дубликаты. Кроме того, в 3-м случае, поскольку информация об отправлении и прибытии не совпадает, я хотел бы показать ее как ***.

Я нашел здесь пост, который удаляет все дубликаты ( Найти и удалить повторяющиеся подстроки), но это немного отличается от решения, которое мне нужно.

Может кто-нибудь поделиться своими мыслями, пожалуйста?

3 ответа

Итак, у вас есть столбец базы данных, который содержит эту текстовую строку? Вы заинтересованы в том, чтобы отобразить данные пользователю в новом формате или обновить данные в таблице базы данных новым значением?

У вас есть доступ к исходным данным, из которых была построена эта текстовая строка? Вероятно, было бы проще воссоздать строку в желаемом формате, чем программно редактировать существующую строку.

Если у вас нет доступа к этим данным, возможно, было бы намного проще обновить ваши данные (или переформатировать их для отображения), если вы выполняете манипуляции со строками на языке высокого уровня, таком как 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

Первым шагом является адаптация процесса, определенного в следующей ссылке, чтобы он разделялся на основе /:

Разделенная строка T-SQL

Это возвращает таблицу, которую вы затем просматривали бы, проверяя, содержит ли значение *. В этом случае вы получите текстовые значения до и после * и сравните их. Используйте CHARINDEX, чтобы получить положение *, и SUBSTRING, чтобы получить значения до и после. После того, как они у вас есть, проверьте оба значения и добавьте их в выходную строку соответствующим образом.