2016-01-14 2 views
-1

Возможно, это дубликат, но я не смог найти решение.Заменить несколько экземпляров символа одним экземпляром в sql

Требование:

У меня есть ниже строки:

Heelloo 
Heeelloo 
Heeeelloo 
Heeeeeelloo 
Heeeeeeeelloo 
. 
. 
. 
Heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeelloo 

Ожидаемый результат:Hello

Что является лучшим способом для достижения этой цели в SQL?

Version Я использую:

Microsoft SQL Server 2012 - 10.0.7365.0 (X64) Jul 28 2015 00:39:54 Copyright (c) 
Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> 
(Build 9200:) 
+0

Так что всегда кратно е, чтобы заменить один е? – jarlh

+0

Да, это требование более или менее. – SouravA

+0

Возможный дубликат [Удаление повторяющихся дублированных символов] (http: // stackoverflow.com/questions/5794183/remove-repeat-duplicated-characters) – Bridge

ответ

10

Существует хороший трюк для удаления таких дубликатов для одной буквы:

select replace(replace(replace(col, 'e', '<>' 
          ), '><', '' 
        ), '<>', 'e' 
      ) 

Это требует двух символов ("<" и ">"), которые не находятся в строке (или, более конкретно, не в строке рядом друг с другом). Конкретные символы не важны.

Как это работает?

Heeello 
H<><><>llo 
H<>llo 
Hello 
+0

Ничего себе !! Удивительный ответ! – SouravA

+1

Гордон - Мне очень жаль, но у меня было дополнительное требование здесь, и я забыл спросить его в вопросе. Могу ли я изменить текущий вопрос, пожалуйста? (Я должен был бы отменить ваш ответ в качестве ответа). – SouravA

+1

@SouravA. , , Ваш оригинальный вопрос был совершенно ясен. Вы должны задать новый вопрос в качестве нового вопроса. Изменение вопроса делает недействительными ответы, которые рисуют downvotes. Следовательно, это грубо. –

1

Тест пользовательской функции:

CREATE FUNCTION TrimDuplicates(@String varchar(max)) 
RETURNS varchar(max) 
AS 
BEGIN 
    while CHARINDEX('ee',@String)>0 BEGIN SET @String=REPLACE(@String,'ee','e') END 
    while CHARINDEX('oo',@String)>0 BEGIN SET @String=REPLACE(@String,'oo','o') END 
    RETURN @String 
END 

Пример:

select dbo.TrimDuplicates ('Heeeeeeeelloo') 

возвращает Привет

1

На основе T-SQL String Manipulation Tips and Techniques, Part 1 особенно части Replacing Multiple Contiguous Spaces With a Single Space and idea of Peter Larsson, a SQL Server MVP:

Затем раствор включает три этапа (предполагая, что маркер является ~):

  1. Заменить в @str каждого вхождения '' (пробел), с '~' (маркер плюс место).
  2. Замените в результате предыдущего шага каждое вхождение '~' (пробел плюс токен) с помощью '' (пустая строка).
  3. Заменить в результате предыдущего шага каждое вхождение '~' (токен плюс пробел) с помощью '' (пробел).
CREATE TABLE #tab(val NVARCHAR(100)); 

INSERT INTO #tab 
SELECT 'Hello' 
UNION ALL SELECT 'Heello' 
UNION ALL SELECT 'Heeello' 
UNION ALL SELECT 'Heeeello' 
UNION ALL SELECT 'Heeeeeello' 
UNION ALL SELECT 'Heeeeeeeello' 
UNION ALL SELECT 'Heeeeeeeeeello'; 

-- version for one vowel(it can be enhanced to handle other if needed) 
SELECT val, 
cleaned = REPLACE(
      REPLACE(
      REPLACE(
      REPLACE(REPLACE(val, REPLICATE('e', 8), '^^') 
       , 'e', '~ ') 
      , ' ~', '') 
      , '~ ', 'e') 
      ,'^^','ee')    
FROM #tab; 

LiveDemo

Выход:

╔════════════════╦═════════╗ 
║  val  ║ cleaned ║ 
╠════════════════╬═════════╣ 
║ Hello   ║ Hello ║ 
║ Heello   ║ Hello ║ 
║ Heeello  ║ Hello ║ 
║ Heeeello  ║ Hello ║ 
║ Heeeeeello  ║ Hello ║ 
║ Heeeeeeeello ║ Heello ║ 
║ Heeeeeeeeeello ║ Heeello ║ 
╚════════════════╩═════════╝ 
+0

Я поддержал его. Если вы копируете этот ответ по этому вопросу, я буду отмечать его как ответ. Гордон попал туда первым, что означало его ответ. – SouravA

Смежные вопросы