SQL Server使用正则表达式

时间:2017-02-12 14:13:57

标签: sql-server regex

这应该是一个简单的,但我没有找到合适的解决方案。

我需要使用SQL(SQL Server)实现(相当)简单替换,如下所示。想象一下,你有一个看起来像这样的字符串:

'This is a simple example where aaa[0004] should become aaa[4] and b[0],c[1] should remain unchanged'

换句话说,模式[0004]应该变为[4]

我最初想过更换像:

  SET @MyString = REPLACE(@MyString,'[0','[') ;

但是,即使在测试之前,我意识到它也会将[0]转换为[],这不是我想要的。

我知道如何在PL / SQL中完成它,但在SQL Server中我遇到了困难。

3 个答案:

答案 0 :(得分:2)

另一种选择。这将取代最多25次出现'[0'和每行多次[...]。

示例

Declare @MyString varchar(max) = 'This [0] [000] is a simple example where aaa[0004] should become aaa[4] and test [0]'

Select @MyString = Replace(@MyString,MapFrom,MapTo)
  From (
        Select MapFrom='0]',MapTo='§§0]'
        Union All           
        Select Top 25 '[0','['  From master..spt_values 
        Union All
        Select '§§0]','0]'
        ) b 

Select @MyString

<强>返回

This [0] [0] is a simple example where aaa[4] should become aaa[4] and test [0]

注意:如果处理表格,应用某些XML将是一件小事

答案 1 :(得分:1)

如果有一个字符(下面为(1+5 2+6 3+7 4+8)),您可以合理地确信它不会出现在数据中,以下内容最多可用于15个前导零。

~

Demo

答案 2 :(得分:0)

感谢Martin的建议,我采用了以下解决方案:

    Declare @MyString   varchar(max) ;
    Declare @MyString_T varchar(max) ;

    SET @MyString = 'This is a simple example where aaa[00000000000000000000000000004] should become aaa[40] and test [000] and ccc[]' ;

    WHILE (1=1)
        BEGIN
            SET @MyString_T = REPLACE(
                                REPLACE(
                                  REPLACE(@MyString,'0]', '~'), 
                                '[0','['),
                              '~','0]') ;

            IF @MyString_T = @MyString
                BREAK ;
            ELSE
               SET @MyString = @MyString_T ;
        END ;

    Print(@MyString) ;

结果是:

This is a simple example where aaa[4] should become aaa[40] and test [0] and ccc[]

再次感谢Martin !!!