用sql中的单个实例替换多个字符实例

时间:2016-01-14 14:50:49

标签: sql sql-server tsql

可能它是重复的,但我无法找到解决方案。

要求:

我有以下字符串:

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: )

3 个答案:

答案 0 :(得分:11)

有一个很好的技巧可以删除单个字母的重复项:

$con

这确实需要两个不在字符串中的字符(&#34;&lt;&#34;和&#34;&gt;&#34;)(或者更具体地说,不在彼此相邻的字符串中) )。特定字符并不重要。

这是如何运作的?

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

答案 1 :(得分:2)

基于 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时更换@str &#39; (空格)用&#39;〜&#39; (令牌加空格)。
  2.   
  3. 在上一步的结果中替换每次出现的&#39; 〜&#39; (空格加令牌)与&#39;&#39; (一个空字符串)。
  4.   
  5. 每次出现&#39;〜&#39; (令牌加空格)&#39; &#39; (空间)。
  6.   
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 ║
╚════════════════╩═════════╝

答案 2 :(得分: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')

返回Hello