18

&lt;特定のデータベース列ですべての '<' を置き換える最良の方法は何ですか? 基本的に行うs/&lt[^;]/&lt;/gi

ノート:

  • MS SQL Server 2000で動作する必要があります
  • 繰り返し可能でなければならない (そして で終わらない&lt;;;;;;;;;;)
4

5 に答える 5

17

ハッキングが必要ですが、これはLIKEPATINDEXLEFT 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 のバージョンに依存せず、問題なく動作することです。

于 2008-09-29T22:46:30.873 に答える
11

別の 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
于 2008-09-30T15:50:49.473 に答える
7

どうですか:

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

編集:

これにより、部分的に正しい文字列を持つ列が無視されることに気付きました&lt;

その場合、where 句の 2 番目の部分を無視して、後でこれを呼び出すことができます。

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')
于 2008-09-30T16:05:26.100 に答える
1

MSSQL の正規表現フレーバーが否定的な先読みをサポートしている場合、それはこれにアプローチする正しい方法です。

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

;が続かない<のすべてのインスタンスをキャッチします。( [^;]が見逃すものがない場合でも)、次の非;をキャプチャしません。これにより、そのキャラクターが置換で失われるという元の質問に関するコメントで言及された問題が解消されます。

残念ながら、私は MSSQL を使用していないので、否定先読みをサポートしているかどうかはわかりません...

于 2008-09-30T16:26:13.477 に答える