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

alu*_*umb 17 regex sql sql-server sql-server-2000

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

笔记:

  • 必须在MS SQL Server 2000中工作
  • 必须是可重复的(而不是最终&lt;;;;;;;;;;)

Jor*_*ira 16

需要一些黑客攻击,但我们可以使用LIKE,PATINDEX,LEFTRIGHT以及良好的旧字符串连接来完成此操作.

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
Run Code Online (Sandbox Code Playgroud)

更好的是,这是SQL Server版本无关的,应该工作得很好.


leo*_*nfo 10

我认为如果你使用不同的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
Run Code Online (Sandbox Code Playgroud)


ili*_*rit 6

怎么样:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt', '&lt;')
    WHERE columnName LIKE '%lt%'
    AND columnName NOT LIKE '%lt;%'
Run Code Online (Sandbox Code Playgroud)

编辑:

我刚刚意识到这会忽略具有部分正确&lt;字符串的列.

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

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')
Run Code Online (Sandbox Code Playgroud)