如何检索关键字之前和之后的设定数量的字符?

时间:2017-10-24 19:36:14

标签: sql sql-server tsql sql-server-2012

我正在使用SQL Server 2012来查询数据。

其中一列是自由形式的文本框,我需要列中的数据,但我不希望整个段落回来。我想查找像'过时'这样的关键字,并检索它前面的20个字符以及它后面的20个字符。

如果我将解决方案应用于以下段落,那里我正在寻找过时的词和它前后的20个字符:

  

1992年,Tim Berners-Lee发布了一份名为“HTML标签”的文件,其中仅列出了20个标签,其中许多标签现已过时或已采用其他形式。在关键锚标记之后,文档中定义的第一个幸存标记是段落标记。直到1993年才对拟议的图像标签进行了讨论。

它将返回:“其中任何一个现已过时或已经采取其他”

注意:我是最终用户,而不是管理员,所以请不要告诉我,如果这是一个问题,我们不应该允许自由格式文本框。

3 个答案:

答案 0 :(得分:3)

您可以使用此查询来实现结果:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Start task.exe"); 
    system("task.exe && command ");
    return 0;         
}

答案 1 :(得分:1)

你可以试试这个。

DECLARE @Paragraph VARCHAR(MAX) = 'In 1992, Tim Berners-Lee circulated a document titled “HTML Tags,” which outlined just 20 tags, many of which are now obsolete or have taken other forms. The first surviving tag to be defined in the document, after the crucial anchor tag, is the paragraph tag. It wasn’t until 1993 that a discussion emerged on the proposed image tag.'
DECLARE @SomeString VARCHAR(20) = 'obsolete'

SELECT SUBSTRING(@Paragraph, PATINDEX('%' + @SomeString + '%', @Paragraph) - 20, LEN(@SomeString) + 40)

答案 2 :(得分:0)

我试图弄清楚如何从文本字符串中获取IP地址。这是我的操作方式:

CASE
    WHEN SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
        CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 24) = 'ORIGINATING IP ADDRESS :'
        THEN
            replace(replace(replace(replace(
                RIGHT(SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
                CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 40),15)
                    ,' ',''),'S',''),'E',''),'Y','')
    WHEN SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
        CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 23) = 'ORIGINATING IP ADDRESS:'
        THEN
            replace(replace(replace(replace(
                RIGHT(SUBSTRING(REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' '),
                CHARINDEX('ORIGINATING IP ADDRESS', REPLACE(REPLACE(REPLACE(CS.Comment, CHAR(13), ' '), CHAR(10), ' '), CHAR(9), ' ')), 39),15)
                    ,' ',''),'S',''),'E',''),'Y','')
    ELSE NULL
    END [IP]

我发现每个文本框中唯一一致的内容是“源IP地址”,但显示为“ ORIGINATING IP ADDRESS:”或“ ORIGINATING IP ADDRESS:”,我可以将代码锚定到这两个字符串。同样,每个IP地址后面都是两个单词之一,并加上一些空格,因此,如果IP地址的字符数少于15个,则'','S,E或Y'的某些组合会出现在我的搜索结果中。自然的解决方案是不使用任何字符替换这些字符,从而非常巧妙地削减了每个IP地址末尾的垃圾。

去年我学到了很多东西。 :-)