<
特定のデータベース列ですべての '<' を置き換える最良の方法は何ですか? 基本的に行うs/<[^;]/</gi
ノート:
- MS SQL Server 2000で動作する必要があります
- 繰り返し可能でなければならない (そして で終わらない
<;;;;;;;;;
)
<
特定のデータベース列ですべての '<' を置き換える最良の方法は何ですか? 基本的に行うs/<[^;]/</gi
ノート:
<;;;;;;;;;
)ハッキングが必要ですが、これはLIKE、PATINDEX、LEFT AND RIGHT、および古き良き文字列連結を使用して行うことができます。
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
while 1 = 1
begin
update test
set val = left(val, patindex('%<[^;]%', val) - 1) +
'<' +
right(val, len(val) - patindex('%<[^;]%', val) - 2)
from test
where val like '%<[^;]%'
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 ('< <- ok, < <- nok')
WHILE 1 = 1
BEGIN
UPDATE test SET
val = STUFF( val , PATINDEX('%<[^;]%', val) + 3 , 0 , ';' )
FROM test
WHERE val LIKE '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
END
select * from test
どうですか:
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
編集:
これにより、部分的に正しい文字列を持つ列が無視されることに気付きました<
。
その場合、where 句の 2 番目の部分を無視して、後でこれを呼び出すことができます。
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
MSSQL の正規表現フレーバーが否定的な先読みをサポートしている場合、それはこれにアプローチする正しい方法です。
s/<(?!;)/</gi
;が続かない<のすべてのインスタンスをキャッチします。( [^;]が見逃すものがない場合でも)、次の非;をキャプチャしません。これにより、そのキャラクターが置換で失われるという元の質問に関するコメントで言及された問題が解消されます。
残念ながら、私は MSSQL を使用していないので、否定先読みをサポートしているかどうかはわかりません...