【问题标题】:SQL loop to find all occurrences of a string expression in a DB fieldSQL循环查找数据库字段中所有出现的字符串表达式
【发布时间】:2018-05-06 14:12:56
【问题描述】:

我在 SQL Server DB 表中有一个 varchar(max) 字段,我想在该字段中查找所有出现的字符串,并在读取时为其提供 50 个字符的上下文。

我已经使用下面的代码完成了这项工作,但现在我想对其进行调整,使其适用于所有出现的字符串,并使其出现在一个字段中。

declare @extract varchar(max)
set @extract = 
'As Harry squelched along the deserted corridor he came across somebody who looked just as preoccupied as he was. Nearly Headless Nick, the ghost of Gryffindor Tower, was staring morosely out of a window, muttering under his breath, ". . . don''t fulfill their requirements . . . half an inch, if that . . ." 
"Hello, Nick," said Harry. 

"Hello, hello," said Nearly Headless Nick, starting and looking round. He wore a dashing, plumed hat on his long curly hair, and a tunic with a ruff, which concealed the fact that his neck was almost completely severed. He was pale as smoke, and Harry could see right through him to the dark sky and torrential rain outside. 

"You look troubled, young Potter," said Nick, folding a transparent letter as he spoke and tucking it inside his doublet. 

"So do you," said Harry.'

declare @searchterm varchar(max)
set @searchterm = '%Harry%'

declare @searchtermlength int = len(@searchterm)
declare @stringFrom int = (select PATINDEX(@searchterm,@extract) - 50 )
declare @stringto int = (select PATINDEX(@searchterm,@extract) + @searchtermlength + 50 )
declare @noChars int = @stringto - @stringfrom

select SUBSTRING(@extract,@stringFrom,@noChars)

这将返回'As Harry squelched along the deserted corridor he came acros',但我希望它返回:

As Harry squelched along the deserted corridor he came acros...
...f an inch, if that . . ." "Hello, Nick," said Harry. "Hello, hello," said Nearly Headless Nick, sta
...ost completely severed. He was pale as smoke, and Harry could see right through him to the dark sky and tor...
...king it inside his doublet. "So do you," said Harry.

我猜这可以使用循环来完成,但我之前从未真正使用过循环,因此非常感谢任何帮助。

提前致谢

【问题讨论】:

  • 这与光标无关,但不清楚你在这里真正想要完成什么......
  • 很抱歉错误地假设这将使用光标。正如我所说,我对他们的经验很少。我不知道如何才能更清楚,我已经提供了我当前的代码、当前输出和所需的输出。你能告诉我我错过了什么,我会编辑我的帖子。

标签: sql tsql for-loop substring patindex


【解决方案1】:

希望这就是你所看到的

DECLARE @extract NVARCHAR(MAX)
DECLARE @out_table TABLE (string NVARCHAR(MAX))
DECLARE @search_string NVARCHAR(20)
DECLARE @pos INT
DECLARE @start_pos INT
DECLARE @trim_len INT
DECLARE @string_len INT
DECLARE @search_string_len INT
DECLARE @old_pos INT
DECLARE @start_dots NVARCHAR(3)
DECLARE @end_dots NVARCHAR(3)

SET @extract ='As Harry squelched along the deserted corridor he came across somebody who looked just as preoccupied as he was. Nearly Headless Nick, the ghost of Gryffindor Tower, was staring morosely out of a window, muttering under his breath, ". . . don''t fulfill their requirements . . . half an inch, if that . . ." 
"Hello, Nick," said Harry. 
"Hello, hello," said Nearly Headless Nick, starting and looking round. He wore a dashing, plumed hat on his long curly hair, and a tunic with a ruff, which concealed the fact that his neck was almost completely severed. He was pale as smoke, and Harry could see right through him to the dark sky and torrential rain outside. 
"You look troubled, young Potter," said Nick, folding a transparent letter as he spoke and tucking it inside his doublet. 
"So do you," said Harry.'

SET @search_string = 'Harry'
SET @string_len = LEN(@extract)
SET @search_string_len = LEN(@search_string)
SET @old_pos = 0
SET @pos = PATINDEX('%' + @search_string + '%',@extract) 

WHILE @pos > 0 AND @old_pos <> @pos
BEGIN

    SET @start_dots = '...'
    SET @end_dots = '...'

    IF (@pos - 50) < 1
    BEGIN
        SET @start_pos = 1
        SET @start_dots = ''
    END
    ELSE
    BEGIN
        SET @start_pos = @pos - 47  -- 3 chars for the dots
    END

    IF (@pos + @search_string_len + 50) > @string_len
    BEGIN
        SET @trim_len = (@string_len - @start_pos) + 1
        SET @end_dots = ''
    END
    ELSE
    BEGIN
        SET @trim_len = (@pos - @start_pos) + @search_string_len + 47  -- 3 chars for the dots
    END

    INSERT INTO @out_table
    SELECT @start_dots + SUBSTRING(@extract, @start_pos, @trim_len) + @end_dots

    SET @old_pos = @pos
    SET @pos = PATINDEX('%' + @search_string + '%',SUBSTRING(@extract, @pos + 1,LEN(@extract))) + @pos
END

SELECT * FROM @out_table

输出

As Harry squelched along the deserted corridor he came ...
... an inch, if that . . ."   "Hello, Nick," said Harry.   "Hello, hello," said Nearly Headless Nick, ...
... completely severed. He was pale as smoke, and Harry could see right through him to the dark sky an...
...ing it inside his doublet.   "So do you," said Harry.

【讨论】:

  • 只是在玩你的代码,但它现在看起来还不错!谢谢
  • @Simon Tindall ,我不确定你为什么要在这种情况下使用光标。游标通常用于遍历选择查询的记录
  • 我不想使用游标,我只想运行 patindex 代码,直到没有代码可以搜索该记录。我在提到光标时使用了错误的术语,道歉。
  • @Simon Tindall 很酷。上述代码是否有效或仍有问题?
  • 标记为答案
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多