在 SQL 查询中执行正则表达式(替换)
-
02-07-2019 - |
题
将所有 '<' 替换为的最佳方法是什么 <
在给定的数据库列中?基本上执行 s/<[^;]/</gi
笔记:
- 必须工作于 微软SQL服务器 2000
- 必须是可重复的(并且不会以
<;;;;;;;;;
)
解决方案
需要一些黑客攻击,但我们可以这样做 喜欢, 专利索引, 左边 和 正确的 以及良好的旧字符串连接。
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 版本无关,并且应该可以正常工作。
其他提示
我认为如果你使用不同的东西,这可以做得更干净:)
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 子句的第二部分,然后调用它:
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
本文 介绍了如何创建一个简单的正则表达式替换函数,您可以在 SQL 2000(以及经过简单调整的 2005)中使用该函数来为您提供帮助。
如果 MSSQL 的正则表达式风格支持负向前瞻,那么这将是解决此问题的正确方法。
s/<(?!;)/</gi
将捕获所有实例 << 后面没有跟随 ; (即使他们后面什么都没有, [^;] 会错过)并且不捕获以下非; 角色作为比赛的一部分,消除了关于该角色在替换中丢失的原始问题的评论中提到的问题。
不幸的是,我不使用MSSQL,所以我不知道它是否支持负向前看......
对于这种模式非常具体,但我过去也做过类似的事情:
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')
不隶属于 StackOverflow