相关问题:
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: )
答案 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
部分:
然后,解决方案涉及三个步骤(假设令牌是〜):
- 每次出现@str时更换@str &#39; (空格)用&#39;〜&#39; (令牌加空格)。
- 在上一步的结果中替换每次出现的&#39; 〜&#39; (空格加令牌)与&#39;&#39; (一个空字符串)。
- 每次出现&#39;〜&#39; (令牌加空格)&#39; &#39; (空间)。
醇>
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
强>