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 列に存在するすべての行を見つけたいと考えています。

  • PrimaryValue: フィーバー
  • DataRowType: 現在

私はこのクエリを使用しています:

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 - Value in Select ステートメントを含めるにはどうすればよいですか?

ありがとうアイワン。しかし、私の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 に答える