SQL 服务器查询以从文本列中删除文本

SQL Server query to delete text from text column

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

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

我如何编写查询来更新所有这些记录以删除 <tag></tag> 和中间的所有文本?

我想把这个写到另一个 'temporary' table 以先验证更改然后更新原始 table。

我是运行SQLServer 2014 Express。

谢谢

您可以使用 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,但实际上不会更新任何内容。

我认为唯一会失败的方法是嵌套标签。 <b><i>sometext</i></b>

实际进行更改:

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

在 SQL 服务器 2012 上测试。

这是一个删除标签的函数..

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

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

CREATE TABLE dbo.OtherTable (
    OtherField nvarchar(MAX) NOT NULL
) 
GO

INSERT INTO OtherTable (OtherField)
SELECT dbo.RemoveTag(field, 'tag') from table

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

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

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

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

不确定额外的白色space是否会成为问题,因此您可能想要trim并在中间添加一个space字符。

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