Sql server SQL Server:替换文本字段中相同字符的序列(仅限TSQL)
我有一个文本列varchar(4000),其中包含以下文本:Sql server SQL Server:替换文本字段中相同字符的序列(仅限TSQL),sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个文本列varchar(4000),其中包含以下文本: 'aaabbaaaccaaccc' 我需要删除所有重复的字符-因此序列中只剩下一个: 'abacbac' 它不应该是函数、过程或CLR-Regex解决方案。只有真正的SQL选择 目前我考虑使用recursive WITH子句替换'aa'->'a','bb'->'b','cc'->'c' 所以递归应该循环,直到该字符的所有重复序列都被替换为止 你有没有其他的解决方案,也许更有效 PS:我在这个网站上搜索了不同的替换示例-它们不适合这个
'aaabbaaaccaaccc'
我需要删除所有重复的字符-因此序列中只剩下一个:
'abacbac'
它不应该是函数、过程或CLR-Regex解决方案。只有真正的SQL选择
目前我考虑使用recursive WITH子句替换'aa'->'a','bb'->'b','cc'->'c'
所以递归应该循环,直到该字符的所有重复序列都被替换为止
你有没有其他的解决方案,也许更有效
PS:我在这个网站上搜索了不同的替换示例-它们不适合这个案例 假设表定义为
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)
这听起来像是一个家庭作业问题。为什么没有功能?是的,是一种测试。但我想检查递归“WITH”变量是否正确。没有函数,因为我知道如何用函数实现它。找到最好的SQL本机方法很有趣。我可以添加一个帮助表吗?它将非常小,但有,哦,我不知道,4000行:)如果它将在查询中没有问题。不允许创建表。澄清一下:列可能包含4000个字符宽的序列。结果:太棒了!)我的想法几乎是一样的。但方法不同。你的更普遍!谢谢对于包含100000多行的表,性能问题又如何呢???我说的对吗,这是唯一一个通过本机SQL执行此操作的选项?对于这么多行,执行时间大约为10秒。替代方案(我最初看到的)是使用一个物理表替代带有索引的数字。您可能会从中得到一些改进,但查询速度较慢的部分是重复数据消除-任何此类字符串操作都会有速度开销。请注意,10秒是基于与上面类似的字符串长度。正如所建议的,时间涉及重复数据消除。将所有字段设置为4000个字符,每分钟可以看到大约1000个结果。如果字段中有重复的值,则只需向该查询提供唯一的值即可获得优化。
rowid deduped
1 abacbac
2 abcdefghabjdueueu9whwhw