在 SQL 查询中执行正则表达式(替换)

发布于 2024-07-06 22:33:44 字数 311 浏览 5 评论 0原文

在给定数据库列中将所有“&lt”替换为 < 的最佳方法是什么? 基本上执行 s/&lt[^;]/

注意:

  • 必须在 MS SQL Server 2000
  • 必须可重复(并且不能以 <;;;;;;;;; 结尾)

What is the best way to replace all '<' with < in a given database column? Basically perform s/<[^;]/</gi

Notes:

  • must work in MS SQL Server 2000
  • Must be repeatable (and not end up with <;;;;;;;;;)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

删除会话 2024-07-13 22:33:45

我认为如果你使用不同的东西,这可以做得更干净:)

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

I think this can be done much cleaner if you use different 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
守望孤独 2024-07-13 22:33:45

怎么样:

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

编辑:

我刚刚意识到这将忽略具有部分正确的 < 字符串的列。

在这种情况下,您可以忽略 where 子句的第二部分,然后调用它:

    UPDATE tableName
    SET columName = REPLACE(columName , '<;', '<')

How about:

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

Edit:

I just realized this will ignore columns with partially correct < strings.

In that case you can ignore the second part of the where clause and call this afterward:

    UPDATE tableName
    SET columName = REPLACE(columName , '<;', '<')
晌融 2024-07-13 22:33:45

如果 MSSQL 的正则表达式风格支持负向前瞻,那么这将是解决此问题的正确方法。

s/<(?!;)/</gi

将捕获 < 后面没有 ; 的所有实例(即使它们后面没有任何内容,[^;] 会错过)并且不会捕获以下非 ; 字符作为匹配的一部分,从而消除了有关该字符在替换中丢失的原始问题的评论中提到的问题。

不幸的是,我不使用MSSQL,所以我不知道它是否支持负向前看......

If MSSQL's regex flavor supports negative lookahead, that would be The Right Way to approach this.

s/<(?!;)/</gi

will catch all instances of < which are not followed by a ; (even if they're followed by nothing, which [^;] would miss) and does not capture the following non-; character as part of the match, eliminating the issue mentioned in the comments on the original question of that character being lost in the replacement.

Unfortunately, I don't use MSSQL, so I have no idea whether it supports negative lookahead or not...

べ繥欢鉨o。 2024-07-13 22:33:45

对于这种模式非常具体,但我过去也做过类似的事情:

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')

Very specific to this pattern, but I have done similar to this in the past:

REPLACE(REPLACE(columName, '<', '<'), '<', '<')

broader example (encode characters which may be inappropriate in a TITLE attribute)

REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    columName
    -- Remove existing encoding:
    , '&', '&')
    , '"', '"')
    , ''', '''')
    -- Reinstate/Encode:
    , '&', '&')
    -- Encode:
    , '"', '"')
    , '''', ''')
    , ' ', '%20')
    , '<', '%3C')
    , '>', '%3E')
    , '/', '%2F')
    , '\', '%5C')
给不了的爱 2024-07-13 22:33:44

需要一些黑客技术,但我们可以通过 LIKEPATINDEXLEFTRIGHT 以及良好的旧字符串连接来做到这一点。

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 版本无关,并且应该可以正常工作。

Some hacking required but we can do this with LIKE, PATINDEX, LEFT AND RIGHT and good old string concatenation.

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

Better is that this is SQL Server version agnostic and should work just fine.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文