Функция SQL Server для устранения реплицированных символов - PullRequest
0 голосов
/ 27 января 2010

Интересно, есть ли в SQL Server 2005 простой и эффективный способ устранения реплицированных символов в строке? Как преобразование

'ABBBCDEEFFFFG' to 'ABCDEFG'

Действительно ужасно, что SQL Server имеет такую ​​плохую библиотеку строк и не имеет готовой к использованию функции регулярного выражения ...

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Вы можете использовать функциональность CLR, встроенную в SQL Server 2005/2008, чтобы сделать это с помощью кода .NET.

Журнал MSDN написал об этом в их февраль 2007 выпуске.

Если это не приемлемое решение, здесь - это UDF, который будет делать то же самое, учтите, что это примерно на два порядка медленнее, чем решение CLR.

0 голосов
/ 27 января 2010

Я знаю о решении CLR, но, как я уже сказал, я не отвечаю и не уполномочен применять его в рассматриваемой БД.

Для этой конкретной проблемы я решил написать очень простой и довольно глупый цикл. Я боюсь, что это не будет достаточно быстро для миллионов записей, но в любом случае ... Я хотел бы сделать это на уровне приложений, но я связан с T-SQL здесь ..

  DECLARE @i int ;  -- counter
  DECLARE @input varchar(200) ;
  SET @input = 'AAABCDEEFFBBBXYZSSSWWWNT'

  IF LEN(@input) > 1
  BEGIN
    DECLARE @unduplicated varchar(200) ;
    SET @unduplicated = SUBSTRING(@input,1,1) ;

    SET @i = 2 ;
    WHILE @i <= LEN(@input)
    BEGIN
      -- If current char is different from the last char, concatenate, else not
      IF SUBSTRING(@unduplicated, LEN(@unduplicated), 1) <> SUBSTRING(@input, @i, 1)
        SET @unduplicated = @unduplicated + SUBSTRING(@input, @i, 1) ;
      SET @i = @i + 1;
    END
  END  
  SELECT @unduplicated AS unduplicated;

Результат:

unduplicated 
ABCDEFBXYZSWNT
0 голосов
/ 27 января 2010

YMMV. Похоже, это работает для вашей строки выше. Но не ABBBCDEEBBBBG

DECLARE @Numbers TABLE (Num smallint NOT NULL PRIMARY KEY)

INSERT @Numbers (Num)
SELECT TOP 8000
    ROW_NUMBER() OVER (ORDER BY c1.NAME)
FROM
    sys.columns c1

DECLARE @STuff TABLE (Seq varchar(100) NOT NULL PRIMARY KEY)

INSERT @STuff (Seq) VALUES ('ABBBCDEEFFFFG') --works

SELECT
    Single
FROM
    (
    SELECT DISTINCT
        CAST(Single AS varchar(100))
    FROM
       @Numbers N
       CROSS APPLY 
       (SELECT Seq, SUBSTRING(Seq, Num, 1) AS Single FROM @Stuff) S
    WHERE
       Num <= LEN(Seq)
    FOR XML PATH ('')
    ) foo(Single)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...