在SQL查询中执行正则表达式(替换)

时间:2020-03-06 14:53:59  来源:igfitidea点击:

在给定的数据库列中用'<替换所有'&lt'的最佳方法是什么?基本上执行s /&lt [^;] / </ gi`

笔记:

  • 必须在MS SQL Server 2000中工作
  • 必须是可重复的(并且不能以&lt;;;;;;;;;;结尾

解决方案

本文介绍如何创建一个简单的Regex替换函数,该函数可在SQL 2000(以及带有简单调整的2005)中使用,以为我们提供帮助。

需要进行一些黑客攻击,但我们可以使用LIKE,PATINDEX,LEFT AND RIGHT和良好的旧字符串连接来实现。

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

while 1 = 1
begin
    update test
        set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                      '&lt;' +
                      right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
    from test
    where val like '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
end

select * from test

更好的是,这与SQL Server版本无关,并且应该可以正常工作。

我认为如果我们使用其他STUFF,则可以做得更干净:)

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

WHILE 1 = 1
BEGIN
    UPDATE test SET
        val = STUFF( val , PATINDEX('%&lt[^;]%', val) + 3 , 0 , ';' )
    FROM test
    WHERE val LIKE '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
END

select * from test

怎么样:

UPDATE tableName
    SET columName = REPLACE(columName , '&lt', '&lt;')
    WHERE columnName LIKE '%lt%'
    AND columnName NOT LIKE '%lt;%'

编辑:

我只是意识到这将忽略具有部分正确的&lt;字符串的列。

在这种情况下,我们可以忽略where子句的第二部分,然后再调用它:

UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')

如果MSSQL的regex样式支持负先行,那将是解决此问题的正确方法。

s/&lt(?!;)/&lt;/gi

将捕获所有&lt实例,但不带;的所有实例。 (即使它们后面没有空格,[^;]也会丢失),并且不会捕获以下非-字符;字符作为比赛的一部分,从而消除了有关该字符在替换中丢失的原始问题的注释中提到的问题。

不幸的是,我没有使用MSSQL,所以我不知道它是否支持否定提前查询。