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

时间:2010-03-17 22:55:36

标签: sql-server sql-server-2005

我有一个带文字的文本列varchar(4000):

'aaabbaaacbaaaccc'

我需要删除所有重复的字符 - 所以只剩下序列中的一个:

'abacbac'

它不应该是一个函数,过程或CLR - 正则表达式解决方案。只有真正的SQL选择。

目前我考虑使用递归的WITH子句替换'aa' - >'a','bb' - >'b','cc' - >'c'。

因此,递归应循环,直到替换该字符的所有重复序列。

你有另一个解决方案,也许是更高效的解决方案吗?

PS:我在这个网站上搜索了不同的替换示例 - 他们不适合这种情况。

1 个答案:

答案 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