SQL从查询结果中删除子字符串

时间:2013-09-26 12:20:32

标签: sql sql-server string replace sql-server-2012

我有一个从数据库返回数据的查询。在单个字段中,有一个相当长的文本注释,其中包含一个段,使用!markerstart!!markerend!等标记标记进行明确定义。我希望有一个查询返回,并删除两个标记之间的字符串段(并删除标记)。

我通常会在收到数据后执行此客户端,但问题是查询是INSERT查询,它从SELECT语句中获取数据。我不希望文本段存储在存档/报告表中(在此处使用OLTP应用程序),因此我需要找到一种方法来获取SELECT语句以准确返回要插入的内容,在这种情况下,意味着获取SELECT语句以去除不需要的短语,而不是在客户端的后处理中执行。

我唯一的想法是使用SUBSTRINGCHARINDEXCONCAT的一些复杂组合,但我希望有更好的方法,但是,基于{{3我不明白怎么回事。有人有想法吗?

样品:

这是数据库中某个字段中的一长串文本,其中包含需要删除的段。 !markerstart!这是要删除的段。它的长度是未知的和可变的。 !markerend!标记后面出现的该字段部分应保留。

结果:

这是数据库中某个字段中的一长串文本,其中包含需要删除的段。标记后面出现的该字段部分应保留。

使用STUFF的解决方案:

我真的不喜欢这是多么冗长,但如果我真的需要,我可以把它放在一个函数中。它并不理想,但它比CLR例程更容易,更快。

SELECT STUFF(CAST(Description AS varchar(MAX)), CHARINDEX('!markerstart!', Description), CHARINDEX('!markerend!', Description) + 11 - CHARINDEX('!markerstart!', Description), '') AS Description
FROM MyTable

2 个答案:

答案 0 :(得分:2)

您可能需要考虑实现一个返回已解析数据的CLR用户定义函数。

以下链接演示了如何使用CLR UDF RegEx函数进行模式匹配和数据提取。

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

此致

答案 1 :(得分:0)

您可以使用填充功能或替换功能,并用''替换不需要的符号。 STUFF( 'EXP',START_POS, 'NUMBER_OF_CHARS', 'REPLACE_EXP')