【问题标题】:Selecting all the string values that match, from XML从 XML 中选择所有匹配的字符串值
【发布时间】:2019-09-12 23:09:32
【问题描述】:

我需要从 XML 列中检索所有以“+”结尾的句子。我当前的查询仅检索第一句话。

以下是 XML 内容:

<file>
  <row>Addendum and/or contract providing additional event details and conditions. +</row>
  <row />
  <row>Special duty officer(s) required for event. There are charges for these services.+</row>
  <row />
  <row>Notify Mall Crew of electrical needs for activities.+</row>
  <row />
  <row>8’ pedestrian pathway must be maintained on sidewalks throughout event area.~</row>
  <row />
  <row>Provide and maintain access to the Hotel during event.~</row>
  <row />
  <row>Event organizer/sponsor is responsible for cleanup of event area.|</row>
  <row />  
</file>

您可以看到有三行以“+”结尾的句子。我运行这个查询:

SELECT b.value('(./row/text())[1]','nvarchar(max)') as [row]
FROM @xmlstr.nodes('/file') AS a(b)
WHERE right(b.value('(./row/text())[1]','nvarchar(max)'), 1) = '+'

但我只得到第一句话,我需要所有最后带有加号的句子。

如果有人能帮我解决这个问题,我将非常感激

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    John 的解决方案很棒,只是为了提供替代方案,您可以致电 XQuery 来检查最后一个字符,如下所示:

    DECLARE @xml XML=N'<file>
      <row>Addendum and/or contract providing additional event details and conditions. +</row>
      <row />
      <row>Special duty officer(s) required for event. There are charges for these services.+</row>
      <row />
      <row>Notify Mall Crew of electrical needs for activities.+</row>
      <row />
      <row>8’ pedestrian pathway must be maintained on sidewalks throughout event area.~</row>
      <row />
      <row>Provide and maintain access to the Hotel during event.~</row>
      <row />
      <row>Event organizer/sponsor is responsible for cleanup of event area.|</row>
      <row />  
    </file>';
    
    SELECT r.value('text()[1]','nvarchar(1000)')
    FROM @xml.nodes('/file/row[substring(text()[1],string-length(text()[1]),1)="+"]') A(r);
    

    结果

    Addendum and/or contract providing additional event details and conditions. +
    Special duty officer(s) required for event. There are charges for these services.+
    Notify Mall Crew of electrical needs for activities.+
    

    【讨论】:

    • 哇! xquery 方法有 15% 的执行计划批处理,而我的 85%。我又一次学到了一些新东西。 +1
    • @JohnCappelletti 真的有那么多吗?没想到会这样......你的可能会用text()[1]而不是./file/row而不是file/*来改进。此外,我希望RIGHT(REVERSE(),1)LIKE '%+' 更快...或SUBSTRING 以获取XQuery 中的最后一个字符...但是,感谢您的支持:-)
    • /file/row 没有变化,但我确实通过 right(...,1) 获得了四个完整的百分点 :)
    【解决方案2】:

    大概是这样的

    SELECT b.value('.','nvarchar(max)') as [row]
     FROM  @xmlstr.nodes('file/*') AS a(b)
    WHERE  b.value('.','nvarchar(max)') like '%+'
    

    退货

    row
    Addendum and/or contract providing additional event details and conditions. +
    Special duty officer(s) required for event. There are charges for these services.+
    Notify Mall Crew of electrical needs for activities.+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多