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)))
我有一个 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)))