SQL Server查询从文本列中删除文本

时间:2016-01-25 23:34:17

标签: sql sql-server-2014-express

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

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

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

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

我正在运行SQL Server 2014 Express。

谢谢

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用CHARINDEX查找标记的开始和停止位置,使用SUBSTRING获取&lt;之间的所有文本。和&gt;,和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
来自TableName的

输出将是三列,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 Server 2012上测试。