有条件地使用“n”个实例替换角色的多个实例

时间:2016-01-15 07:06:20

标签: sql sql-server string tsql

相关问题:

Replace multiple instance of a character with a single instance in sql

要求:

我有以下字符串:

Heelloo
Heeelloo
Heeeelloo
Heeeeeelloo
Heeeeeeeelloo
.
.
.
Heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeelloo

预期输出:

如果字母'e'的实例是8的倍数,则期望为'ee'。对于所有其他情况,它应该是'e'。所以,

1。 Heeeeeeeello应为Heello<< - 'e'替换为'e'的8个实例

2。 Heeeeeeeeeello应为Heeello<< - 'e'替换为'e'的8个实例,然后休息2'e'取而代之的是一个'e'。

3。 Heeello应该Hello

我正在使用的版本

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

2 个答案:

答案 0 :(得分:3)

尝试此用户定义的功能:

CREATE  FUNCTION TrimDuplicates(@String varchar(max))
RETURNS varchar(max)
AS
BEGIN
    SET @String=REPLACE(@String,'eeeeeeee','!@#$%')
    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
    SET @String=REPLACE(@String,'!@#$%','ee')
    RETURN @String
END

示例用法:

select dbo.TrimDuplicates ('Heeeeeeeeeello')

返回Heeello

<强>更新 如果你想在没有UDF的情况下使用它:

DECLARE @String varchar(max)='Heeeeeeeelloo'
SET @String=REPLACE(@String,'eeeeeeee','!@#$%')
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
SET @String=REPLACE(@String,'!@#$%','ee')
SELECT @String

答案 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 ║
╚════════════════╩═════════╝

来自评论(如上面的链接中的alomost相同的情况):

  

一列中有很多不必要的空格。知道如果   有8个空格,表示一个新段落。什么小的   应转换为单个空格。

您可以使用SPACE(8)轻松将其调整为新的需求,而不是将e复制8次而REPLACE复制到新行CHAR(13) + CHAR(10)

DECLARE @text NVARCHAR(MAX) = 'Line    1.        Line     two.';

SELECT @text=REPLACE(
               REPLACE(
                  REPLACE(
                     REPLACE(@text, SPACE(8), CHAR(13) + CHAR(10))
                  , ' ', '~ ')
               , ' ~', '')
             , '~ ', ' ');

PRINT @text;

输出:

Line 1.
Line two.

LiveDemo2