【问题标题】:Removing characters between brackets删除括号之间的字符
【发布时间】:2018-08-29 16:11:00
【问题描述】:

我正在使用 SQL Server 2008 R2,但我正在通过 SQL Server 2012 Management Studio 访问该服务器。

我有一个名为Search 的表,其中有一列Body 类型为(nvarchar(Max), not null)

此列中的数据实际上是电子邮件的正文,此列将所有 HTML 标记作为文本的一部分。

例如,电子邮件正文将显示:

 Good morning
 This invoice has been assigned.

但是当它存储在名为Body 的列中时,它看起来像这样:

[size=14.0pt]Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size] 

我有以下 SQL 来删除“[”和“]”之间的所有内容(包括括号):

 SELECT 
     *,
     CASE 
        WHEN CHARINDEX('[', Body) > 0 AND CHARINDEX(']', Body) > 0 
             AND CHARINDEX('[', Body) < CHARINDEX(']', Body) 
           THEN STUFF(Body, CHARINDEX('[', Body), (CHARINDEX(']', Body) - CHARINDEX('[', Body)) + 1, '')
           ELSE Body
     END AS Body1
FROM search

但这只是删除了第一组标签,现在看起来像这样:

Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]

您能帮我处理一下我的 SQL,以便将它们全部删除,看起来像这样:

Good Morning
This invoice has been assigned.

【问题讨论】:

  • 您使用什么风格的 SQL?例如MYSQL、MS SQL 等?
  • 我正在使用 MS SQL Server 2008 R2,但我正在通过 SQL Server Management Studio 2012 访问该服务器。抱歉,我应该将其包含在我的原始帖子中。
  • 但这不是有效的 HTML。如果它是实际的 HTML,我们可以使用一些技巧。由于情况似乎并非如此,我建议使用 CLR 和正则表达式。

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

您可以定义一个标量函数来删除方括号以及它们之间包含的所有文本:

create function [dbo].[fx_removetags] (@text nvarchar(max))
    returns nvarchar(max) as
begin
    declare @tag_start  int
    declare @tag_end    int
    declare @tag_length int
    set @tag_start = charindex('[', @text)
    set @tag_end = charindex(']', @text, charindex('[', @text))
    set @tag_length = (@tag_end - @tag_start) + 1
    while @tag_start > 0 and @tag_end > 0 and @tag_length > 0
        begin
            set @text = stuff(@text,@tag_start,@tag_length, '')
            set @tag_start = charindex('[',@text)
            set @tag_end = charindex(']',@text,charindex('[', @text))
            set @tag_length = (@tag_end - @tag_start) + 1
        end
    return ltrim(rtrim(@text))
end

现在您可以调用该函数来获取不带括号的文本:

declare @test nvarchar(max)= ''
set @test = '[size=14.0pt]Good morning [/size][size=14.0pt]This invoice has been assigned.[/size] '

select [dbo].[fx_RemoveTags](@test)

结果:

在您的具体情况下,您可以使用如下函数:

SELECT 
     *,
     [dbo].[fx_RemoveTags](@test) as Body1
FROM search

【讨论】:

  • 安德烈亚,感谢您的帮助。我:n关于SQL语句,说的部分: set @test = '[size=14.0pt]早上好[/size][size=14.0pt]这张发票已经分配了。[/size] '怎么办我引用了名为“body”的原始字段。此代码适用于确切的措辞:[size=14.0pt]早上好 [/size][size=14.0pt]这张发票已被分配。[/size] ',但该字段的每个条目都不同。
  • 你测试过不同参数的函数吗?那里没有特定于用例的内容....
  • Eric,谢谢你的回复我还在学习SQL。我完全按照安德里亚发布的方式运行它,并得到了与她完全相同的结果。但是,现在我试图了解如何使用名为“Body”的列来测试它,所有数据都位于该列。我认为这与“set @test = '[size=14.0pt]早安[/size][size=14.0pt]这张发票已分配。[/size]'”这一行有关,但不确定如何将其更改为引用名为“搜索”的表中的“正文”列。
  • 这应该可以。 SELECT dbo.fx_RemoveTags(s.Body) FROM Search AS s; 或许可以尝试SELECT TOP 10.... 启动,只是为了验证功能。
  • @StephenMorrell Eric 是对的,您可以直接在您的select 语句中使用该函数来替换case ... when。我用一个例子更新了我的答案
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2019-11-14
  • 2021-09-19
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多