Функция SQL Server для устранения повторяющихся символов
-
23-09-2019 - |
Вопрос
Интересно, есть ли в SQL Server 2005 простой и эффективный способ устранения повторяющихся символов в строке.Как конвертация
'ABBBCDEEFFFFG' to 'ABCDEFG'
Действительно отстойно, что SQL Server имеет такую плохую библиотеку строк и не имеет готовой к использованию функции регулярных выражений...
Нет правильного решения
Другие советы
Вы можете использовать функциональные возможности CLR, встроенные в SQL Server 2005/2008, чтобы сделать это с помощью кода .NET.
Об этом написал журнал MSDN в своей февраль 2007 г. проблема.
Если это неприемлемое решение, здесь это UDF, которая будет делать то же самое, имейте в виду, что это примерно на два порядка медленнее, чем решение CLR.
ЮММВ.Кажется, это работает для вашей строки выше.Но нет 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)
Я знаю о решении 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