0

在我的数据库表中,我有一个 XML 列。

XML 列中的值如下所示:

第 1 行

  <Data>
  <COLRowData>
  <DORowData>
  <PrimaryValue>Fever</PrimaryValue>  
  <EMRValue1> 101 <EMRValue1 />   
  <DataRowType>Past</DataRowType>
  <HasPositiveValue>True</HasPositiveValue>
  </DORowData>
  <DORowData>
  <PrimaryValue>Hypertension</PrimaryValue>
  <DataRowType>Present</DataRowType>
  <EMRValue1> No </EMRValue1>  
  <HasPositiveValue>False</HasPositiveValue>
 </DORowData>
 </COLRowData>
 </Data>

第 2 行

 <Data>
 <COLRowData>
 <DORowData>
  <PrimaryValue>Diabetes</PrimaryValue>
  <DataRowType>Past</DataRowType>    
  <EMRValue1> No </EMRValue1>  
  <HasPositiveValue>True</HasPositiveValue>   
 </DORowData>
 <DORowData>
<PrimaryValue>Fever</PrimaryValue>
  <DataRowType>Present</DataRowType>
  <EMRValue1> 103  <EMRValue1 />
  <HasPositiveValue>True</HasPositiveValue>    
 </DORowData>    
 </COLRowData>
 </Data>

从这个表中,我想找到所有这样的行,其中以下数据组合存在于单个 XML 列中:

  • 主要价值:发烧
  • 数据行类型:当前

我正在使用这个查询:

Select * From TABLE 
WHERE  
   XML.exist('/Data/COLRowData/DORowData/DataRowType/text()[. = "Present"]') = 1 
   and
     XML.exist('/Data/COLRowData/DORowData/PrimaryValue/text()[. = "Fever"]') = 1 

此查询返回两行,因为我的要求是我应该只根据上面提到的组合找到 Row2。

请帮我查询

另外,如何从满足 where 子句的 XML 中包含 EMRValue1 - 选择语句中的值?

谢谢我。但是由于我的 where 子句仅满足来自该块的数据

   <DORowData>
    <PrimaryValue>Fever</PrimaryValue>
    <DataRowType>Present</DataRowType>
    <EMRValue1> 103  <EMRValue1 />
     <HasPositiveValue>True</HasPositiveValue>    
    </DORowData> 

Select 子句中的 EMRValue1 应仅返回 EMRValue1 = 103 的 1 行

4

1 回答 1

1

您应该在同一个 XPath 中结合这两个条件:

select * from [TABLE]
where
    XML.exist('/Data/COLRowData/DORowData[DataRowType/text()[. = "Present"] and PrimaryValue/text()[. = "Fever"]]') = 1

要包括EMRValue1在选择列表中:

select d.*, T.c.value('text()[1]', 'varchar(200)') EMRValue1
from [TABLE] d
    cross apply d.XML.nodes('/Data/COLRowData/DORowData/EMRValue1') T(c)
where d.XML.exist(...) = 1

请注意,返回的行数将增加,因为每行EMRValue1的数据中有多个元素XML

于 2013-07-08T20:10:32.087 回答