0

我想找到表达式的最新实例,然后继续寻找更好的匹配,然后选择最佳匹配。

我正在查看的单元格是一个重复附加的日志,带有注释,后跟用户名和时间戳。

示例单元格内容:

Starting the investigation.
JWAYNE entered the notes above on 08/12/1976 12:01

Taking over the case. Not a lot of progress recently.
CEASTWOOD entered the notes above on 03/14/2001 09:04

No wonder this case is not progressing, the whole town is covering up some shenanigans!
CEASTWOOD entered the notes above on 03/21/2001 05:23

Star command was right, this investigation has been tossed around like a hot potato for a long time!
BLIGHTYEAR entered the notes above on 08/29/2659 08:01

我不是数据库范式规则方面的专家,但令人讨厌的是条目被挤在一个单元格中,这使得我的工作是隔离和检查特定单词的注释,特别是当单元格重复多行直到调查结束时它将来自未来阶段的注释放入过去事件的注释列中,最重要的是时间戳使时间戳 PATINDEX 甚至几分钟的余量都不可靠,如下所示:

CaseID, Username,  Notes,             Phase, Timestamp
E18902, JWAYNE,    Starting....08:01, E1,    03/14/2001 09:13
E18902, CEASTWOOD, Starting....08:01, E2,    03/14/2001 09:13
E18902, CEASTWOOD, Starting....08:01, E3,    03/21/2001 05:34
E18902, BLIGHTYEAR,Starting....08:01, E4,    08/29/2659 07:58

现在我正在对整个字符串进行反向操作,然后使用 patindex 来查找用户名,然后进行子字符串化以仅选择该调查阶段的注释,问题是当同一个用户为多个阶段输入注释时,我的简单“查找盯着字符串末尾移动到顶部的第一个匹配项”选择了错误的条目。我的第一个想法是搜索用户名,然后再次检查以查看更靠前的条目是否更匹配(注意时间戳与列时间戳),但我不知道如何编写代码......

我必须进行复杂的字符串拆分还是有更简单的解决方案?

4

1 回答 1

1

这是我的建议。这是一个记录,但如果您愿意,您可以将其转换为用户定义的表值函数。

我将使用您上面的示例数据。

 declare @sourceText nvarchar(max)
    ,    @workText   nvarchar(max)
    ,    @xml        xml

 set @sourceText = <your example text in your question>
 set @workText = @sourceText

 -- We're going to replace all the carriage returns and line feeds with 
 -- characters unlikely to appear in your text.  (If they are, use some
 -- other character.)

 set    @workText = REPLACE(@workText, char(10), '|')
 set    @workText = REPLACE(@workText, char(13), '|')

 -- Now, we're going to turn your text into XML.  Our first target is 
 -- the string of four "|" characters that the blank lines between entries
 -- will be turned into.  (If you've got 3, or 6, or blanks in between, 
 -- adjust accordingly.)

set @workText = REPLACE(@workText, '||||', '</line></entry><entry><line>')

-- Now we replace every other "|".  
set @workText = REPLACE(@workText, '|', '</line><line>')

-- Now we construct the rest of the XML and convert the variable to an 
-- actual XML variable.
set @workText = '<entry><line>' + @workText + '</line></entry>'
set @workText = REPLACE(@workText, '<line></line>','') -- Get rid of any empty nodes.

set @xml = CONVERT(xml, @workText)

我们现在应该有一个看起来像这样的 XML 片段。select @xml(此时插入 SQL 即可看到。)

<条目>
  <line>开始调查。</line>
  <line>JWAYNE 于 08/12/1976 12:01 输入上述注释</line>
</entry>
<条目>
  <line>接手此案。最近进展不大。</line>
  <line>CEASTWOOD 于 03/14/2001 09:04 输入上述注释</line>
</entry>
<条目>
  <line>难怪这案子没有进展,全镇都在掩盖一些恶作剧!</line>
  <line>CEASTWOOD 于 03/21/2001 05:23 输入上述注释</line>
</entry>
<条目>
  <line>星令说得对,这次调查像烫手山芋一样折腾了半天!</line>
  <line>BLIGHTYEAR 于 08/29/2659 08:01 输入上述注释</line>
</entry>
我们现在可以将此 XML 转换为我们更喜欢的 XML:
  set @xml = @xml.query(
  'for $entry in /entry
    return <entry><data>
    {
    for $line in $entry/line[position() < last()] 
    return string($line)
    }
    </data>
    <timestamp>{ data($entry/line[last()]) }</timestamp>     
 </entry>
 ')

这为我们提供了如下所示的 XML(出于长度原因,仅显示了一个条目):

<条目>
    <data>开始调查。</data>
    <timestamp>JWAYNE 于 08/12/1976 12:01 输入上述注释</timestamp>
</entry>

您可以使用此查询将其转换回表格数据:

选择 EntryData = R.lines.value('data[1]', 'nvarchar(max)')
    , EntryTimestamp = R.lines.value('timestamp[1]', 'nvarchar(MAX)')
从 @xml.nodes('/entry') 作为 R(lines)

...并获取看起来像这样的数据。

在此处输入图像描述

从那里,你可以做任何你需要做的事情。

于 2016-11-13T22:04:03.570 回答