我有一个带文字的文本列varchar(4000):
'aaabbaaacbaaaccc'
我需要删除所有重复的字符 - 所以只剩下序列中的一个:
'abacbac'
它不应该是一个函数,过程或CLR - 正则表达式解决方案。只有真正的SQL选择。
目前我考虑使用递归的WITH子句替换'aa' - >'a','bb' - >'b','cc' - >'c'。
因此,递归应循环,直到替换该字符的所有重复序列。
你有另一个解决方案,也许是更高效的解决方案吗?
PS:我在这个网站上搜索了不同的替换示例 - 他们不适合这种情况。
答案 0 :(得分:3)
假设
的表定义CREATE TABLE myTable(rowID INT IDENTITY(1,1), dupedchars NVARCHAR(4000))
和数据..
INSERT INTO myTable
SELECT 'aaabbaaacbaaaccc'
UNION
SELECT 'abcdeeeeeffgghhaaabbbjdduuueueu999whwhwwwwwww'
此查询符合您的条件
WITH Numbers(n)
AS
( SELECT 1 AS n
UNION ALL
SELECT (n + 1) AS n
FROM Numbers
WHERE n < 4000
)
SELECT rowid,
( SELECT CASE
WHEN SUBSTRING(dupedchars,n2.n,1) = SUBSTRING(dupedchars+' ',n2.n+1,1) THEN ''
ELSE SUBSTRING(dupedchars,n2.n,1)
END AS [text()]
FROM myTable t2,numbers n2
WHERE n2.n <= LEN(dupedchars)
AND t.rowid = t2.rowid
FOR XML path('')
) AS deduped
FROM myTable t
OPTION(MAXRECURSION 4000)
输出
rowid deduped
1 abacbac
2 abcdefghabjdueueu9whwhw