2016-01-14 148 views
-1

可能是重複的,但我找不到解決方案。用sql中的單個實例替換多個實例的字符

要求:

我有以下字符串:

Heelloo 
Heeelloo 
Heeeelloo 
Heeeeeelloo 
Heeeeeeeelloo 
. 
. 
. 
Heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeelloo 

預期輸出:Hello

什麼是SQL實現這一目標的最佳方式是什麼?

版本我使用

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

所以它總是多封的同一封E取代? – jarlh

+0

是的,這就是或多或少的要求。 – SouravA

+0

[刪除重複的重複字符](http:// stackoverflow。com/questions/5794183/removed-repeated-duplicated-characters) – Bridge

回答

10

有一個很好的把戲單一字母消除這種重複:

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

但這需要兩個字符( 「<」和「>」)不在字符串中(或者更具體地說,不是在彼此相鄰的字符串中)。特定的字符並不重要。

這是如何工作的?

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

哇!真棒回答! – SouravA

+1

戈登 - 我真的很抱歉,但我有一個額外的要求,我忘了問這個問題。我可以編輯當前的問題嗎? (我不得不取消你的答覆作爲答案)。 – SouravA

+1

@SouravA。 。 。你原來的問題很清楚。實際上你應該將修改後的問題作爲一個新問題。改變問題會使答案無效,從而得出提示。因此,這是無禮的。 –

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

相關問題