web-dev-qa-db-ja.com

SQLクエリで正規表現(置換)を実行する

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

ノート:

  • MS SQL Server 2000で動作する必要があります
  • 繰り返し可能である必要があります(<;;;;;;;;;で終わっていないこと)
17
alumb

いくつかのハッキングが必要ですが、これは[〜#〜] like [〜#〜][〜#〜] patindex [〜#〜][〜#〜]左[〜#〜] AND [〜#〜]右[〜#〜]と古き良き文字列連結。

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
Jorge Ferreira

別の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
10
leoinfo

どうですか:

    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;')
6
ilitirit

この記事 は、SQL 2000(および2005で単純なTweakを使用)で使用できる単純な正規表現置換関数を作成する方法を説明しています。

3
Dillie-O

このパターンに非常に固有ですが、私はこれと似たようなことを以前に行いました。

REPLACE(REPLACE(columName, '&lt;', '&lt'), '&lt', '&lt;')

より広い例(TITLE属性で不適切な可能性がある文字をエンコードする)

REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    columName
    -- Remove existing encoding:
    , '&amp;', '&')
    , '&#34;', '"')
    , '&#39;', '''')
    -- Reinstate/Encode:
    , '&', '&amp;')
    -- Encode:
    , '"', '&#34;')
    , '''', '&#39;')
    , ' ', '%20')
    , '<', '%3C')
    , '>', '%3E')
    , '/', '%2F')
    , '\', '%5C')
1
Kristen

MSSQLの正規表現が否定的な先読みをサポートしている場合、これはこれに取り組む正しい方法です。

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

&ltの後に;が続いていないすべてのインスタンスをキャッチします(それらの後に何もない場合でも[^;]はミス)と、次の非;文字を一致の一部としてキャプチャしないため、元の質問のコメントで言及されている、置換時に文字が失われるという問題が解消されます。

残念ながら、私はMSSQLを使用していないため、ネガティブルックアヘッドをサポートしているかどうかはわかりません...

1
Dave Sherohman