SQL Server函数消除复制的字符

时间:2010-01-27 12:48:26

标签: regex sql-server-2005 string

我想知道在SQL Server 2005中是否有一种简单有效的方法来消除字符串中的复制字符。喜欢转换

'ABBBCDEEFFFFG' to 'ABCDEFG'

SQL Server有一个糟糕的字符串库,没有现成的正则表达式功能,真的很糟糕......

3 个答案:

答案 0 :(得分:2)

您可以使用SQL Server 2005/2008中内置的CLR功能来完成.NET代码。

MSDN杂志在他们的February 2007期刊中写到了这一点。

如果这不是一个可接受的解决方案,here是一个UDF也会这样做,请注意,这比CLR解决方案慢了两个数量级。

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

我知道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