SQL Server: заменить последовательность одинаковых символов внутри текстового поля (только TSQL) - PullRequest
2 голосов
/ 18 марта 2010

У меня есть текстовый столбец varchar (4000) с текстом:

'aaabbaaacbaaaccc'

и мне нужно удалить все дублированные символы - так что из последовательности остается только один:

'abacbac'

Это не должно быть функцией, процедурой или решением CLR - Regex. Только правильный выбор SQL.

В настоящее время я думаю об использовании рекурсивного предложения WITH с заменой 'aa' -> 'a', 'bb' -> 'b', 'cc' -> 'c'.

Таким образом, рекурсия должна повторяться до тех пор, пока все дублированные последовательности этих символов не будут заменены.

У вас есть другое решение, возможно, более эффективное?

PS: я искал на этом сайте различные примеры замены - они не подходили для этого случая.

1 Ответ

3 голосов
/ 18 марта 2010

Предполагая, что определение таблицы

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...