Выполните regex (замена) в SQL-запросе

Чем лучший способ состоит в том, чтобы заменить весь '<' < в данном столбце базы данных? В основном выполните s/<[^;]/</gi

Примечания:

  • должен работать в SQL Server 2000 MS
  • Должно быть повторяемым (и не закончиться с <;;;;;;;;;)

17
задан Brock Adams 1 July 2011 в 05:21
поделиться

5 ответов

Некоторое взламывание потребовало, но мы можем сделать это с КАК , , PATINDEX, УЕХАЛ И ПРАВО и старая добрая конкатенация строк.

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 и должно работать просто великолепно.

16
ответ дан 30 November 2019 в 11:45
поделиться

Я думаю, что это может быть сделано намного более чистое при использовании другого МАТЕРИАЛА :)

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
10
ответ дан 30 November 2019 в 11:45
поделиться

Как насчет:

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

Редактирование:

я просто понял, что это проигнорирует столбцы с частично корректным &lt; строки.

В этом случае можно проигнорировать вторую часть, где пункт и называет это позже:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')
6
ответ дан 30 November 2019 в 11:45
поделиться

Эта статья касается, как создать простую функцию Замены Regex, что можно использовать в SQL 2000 (и 2005 с простой тонкой настройкой), который может помочь Вам.

3
ответ дан 30 November 2019 в 11:45
поделиться

Если бы regex разновидность MSSQL поддерживает отрицательное предвидение, которое было бы Правильным Способом приблизиться к этому.

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

поймает все экземпляры & лейтенант , которые не сопровождаются ; (даже если они не сопровождаются ничем, который [^;] отсутствовал бы), и не получает следующее не - ; символ как часть соответствия, устраняя проблему, упомянутую в комментариях к исходному вопросу того символа, потерянного в замене.

, К сожалению, я не использую MSSQL, таким образом, я понятия не имею, поддерживает ли он отрицательное предвидение или нет...

1
ответ дан 30 November 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: