【问题标题】:SQL Server query to delete text from text columnSQL Server 查询以从文本列中删除文本
【发布时间】:2016-05-02 11:08:27
【问题描述】:

我有一个 SQL Server 数据库,其中包含一个表 feedback,其中包含一个文本列 comment。在该列中,我有标签数据,例如

This is my record <tag>Random characters are here</tag> with information. 

我如何编写查询来更新所有这些记录以删除&lt;tag&gt;&lt;/tag&gt; 以及它们之间的所有文本?

我想将此写入另一个“临时”表,以首先验证更改,然后更新原始表。

我正在运行 SQL Server 2014 Express。

谢谢

【问题讨论】:

  • T-SQL 是错误的工具。尝试编写一个小的控制台应用程序来读取这些字段值并使用 RegEx 或 HTML Agility Pack 之类的 HTML 解析器解析它们。
  • 做 2 个子串,使用作为参考的开始和结束标签,并在更新中将它们连接在一起
  • 检查这个SO post,我认为它会有所帮助..

标签: sql sql-server-2014-express


【解决方案1】:

您可以使用 CHARINDEX 查找标签的开始和停止位置,使用 SUBSTRING 获取 之间的所有文本,并使用 REPLACE 替换 '' 的子字符串。

Select Field, 
Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, 
    (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1)  as ToRemove,
replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>',
    Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '') 
    as FinalResult

来自表名

输出将是三列,Field、ToRemove 和 FinalResult,但实际上不会更新任何内容。

我认为这会失败的唯一方法是如果你有嵌套标签。 &lt;b&gt;&lt;i&gt;sometext&lt;/i&gt;&lt;/b&gt;

真正做出改变:

Update #TableName set Field = replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '')

在 SQL Server 2012 上测试。

【讨论】:

    【解决方案2】:

    这是一个删除标签的功能..

    CREATE FUNCTION [dbo].[RemoveTag](@text NVARCHAR(MAX), @tag as nvarchar(max))
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
        declare @startTagIndex as int
        declare @endTagIndex as int
    
        set @startTagIndex = CHARINDEX('<' + @tag + '>', @text)
        if(@startTagIndex > 0) BEGIN
            set @endTagIndex = CHARINDEX('</' + @tag + '>', @text, @startTagIndex)
            if(@endTagIndex > 0) BEGIN
                return LEFT(@text, @startTagIndex - 1) + RIGHT(@text, len(@text) - len(@tag) - @endTagIndex  - 2)
            END
        END
    
        return @text
    END
    

    以后你可以像这样使用它:

    Update table set field = dbo.RemoveTag(field, 'tag')
    

    如果您想将字段写入其他表,那么:

    CREATE TABLE dbo.OtherTable (
        OtherField nvarchar(MAX) NOT NULL
    ) 
    GO
    
    INSERT INTO OtherTable (OtherField)
    SELECT dbo.RemoveTag(field, 'tag') from table
    

    【讨论】:

      【解决方案3】:

      对字符串的格式做了很多假设。但如果它们是有效的,那么这很简单:

      left(s, charindex('<tag>', s - 1)) +
          substring(s, charindex('</tag>', s) + 6, len(s))
      

      显然,我们基本上假设搜索字符串仅以正确的顺序出现一次。还有一个假设是会有匹配的。此外,我使用len(s) 作为从右侧获取的字符数的简单上限。如果您愿意,您可以硬编码一些合适的东西,因为 SQL Server 不会因为超出结尾而出错。 s 只是您的 char 列的替代品。

      http://sqlfiddle.com/#!3/771a3/8

      不确定额外的空格是否会成为问题,因此您可能需要修剪并在中间添加一个空格字符。

      rtrim(left(s, charindex('<tag>', s) - 1)) + ' ' +
          ltrim(substring(s, charindex('</tag>', s) + 6, len(s)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        相关资源
        最近更新 更多