Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:替换文本字段中相同字符的序列(仅限TSQL)_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server SQL Server:替换文本字段中相同字符的序列(仅限TSQL)

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:我在这个网站上搜索了不同的替换示例-它们不适合这个

我有一个文本列varchar(4000),其中包含以下文本:

'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