Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于消除复制字符的SQL Server函数_Regex_Sql Server 2005_String - Fatal编程技术网

Regex 用于消除复制字符的SQL Server函数

Regex 用于消除复制字符的SQL Server函数,regex,sql-server-2005,string,Regex,Sql Server 2005,String,我想知道在SQLServer2005中是否有一种简单有效的方法来消除字符串中的复制字符。喜欢转换 'ABBBCDEEFFFFG' to 'ABCDEFG' SQL Server的字符串库太差了,而且没有现成的regexp功能,这真是太糟糕了。您可以使用SQL Server 2005/2008中内置的CLR功能通过.NET代码来完成这项工作 MSDN杂志在他们的一期中写到了这一点 如果这不是一个可接受的解决方案,那么UDF是否也会这样做,请注意,这比CLR解决方案慢大约两个数量级。YMMV。这似

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

'ABBBCDEEFFFFG' to 'ABCDEFG'

SQL Server的字符串库太差了,而且没有现成的regexp功能,这真是太糟糕了。

您可以使用SQL Server 2005/2008中内置的CLR功能通过.NET代码来完成这项工作

MSDN杂志在他们的一期中写到了这一点


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

YMMV。这似乎适用于上面的字符串。但不是abbbdeebbbg


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

它确实有CLR函数支持,它支持正则表达式。是的,但我不想麻烦C或VB.Net,编译和部署它等等。此外,我在这个特定数据库中的用户角色只是查询,我没有开发人员权限。
  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