在给定数据库列中用<
替换所有'&amp; lt'的最佳方法是什么?基本上执行s/<[^;]/</gi
注意:
<;;;;;;;;;
)答案 0 :(得分:15)
我们可以通过 LIKE , PATINDEX , LEFT 和 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版本无关的,应该可以正常工作。
答案 1 :(得分:10)
我认为如果使用不同的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
答案 2 :(得分:6)
怎么样:
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
编辑:
我刚刚意识到这将忽略具有部分正确<
字符串的列。
在这种情况下,您可以忽略where子句的第二部分,然后调用它:
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
答案 3 :(得分:3)
This article介绍了如何创建一个简单的Regex Replace函数,您可以在SQL 2000(以及2005年的简单调整)中使用它来帮助您。
答案 4 :(得分:1)
如果MSSQL的正则表达式支持负面预测,那将是解决这个问题的正确方法。
s/<(?!;)/</gi
将捕获&amp; lt 的所有实例,后面没有; (即使它们后面没有任何内容, [^;] 会错过)并且不会捕获以下非; 字符作为匹配的一部分,从而消除了关于该字符在替换中丢失的原始问题的评论中提到的问题。
不幸的是,我不使用MSSQL,所以我不知道它是否支持负面预测......
答案 5 :(得分:1)
这种模式非常具体,但我过去也做过类似的事情:
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
更广泛的例子(编码在TITLE属性中可能不合适的字符)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')