2013-08-16 11 views
5

SQL Server 2012データベースに格納されたXMLデータを照会する際に問題が発生しています。私は、クエリしたいノードツリーは、次の形式である -SQLを使用してXMLデータ列を照会する

<eForm> 
    <page id="equalities" visited="true" complete="true"> 
     <Belief> 
     <item selected="True" value="Christian">Christian</item> 
     <item selected="False" value="Jewish">Jewish</item> 
     ... 
     </Belief> 
    </page> 
</eForm> 

私がやりたい何を選択した属性がtrueに等しい項目ノードのvalue属性を返すことです。私はSQLでXMLをクエリするためのチュートリアルをいくつか読んだが、コードを正しく取得できないようだ。

おかげ ステュー

答えて

4

DEMO

SELECT [value].query('data(eForm/page/Belief/item[@selected="True"]/@value)') 
FROM test 
+0

私が(データでXPathをラップされませんでした、ありがとう) – StuartO

+1

一つの小さなノートで、これは –

+0

がhttp://sqlfiddle.com/#を参照してくださいVARCHAR型のxmlことはないでしょう! 6/ddaf2/2 –

0
DECLARE @T TABLE (X XML); 
INSERT @T VALUES ('<eForm> 
         <page id="equalities" visited="true" complete="true"> 
          <Belief> 
          <item selected="True" value="Christian">Christian</item> 
          <item selected="False" value="Jewish">Jewish</item> 
          </Belief> 
         </page> 
        </eForm>') 

SELECT item.value('item[1]', 'NVARCHAR(50)')  
FROM @T 
     CROSS APPLY X.nodes('eForm/page/Belief') i (item) 
WHERE item.value('(item[1]/@selected)[1]', 'VARCHAR(5)') = 'true'; 

N.B.

MarcinJuraszekによって投稿された他のアプローチが実際には好きですが、抽出するデータがさらに必要な場合は、以下の点で利点があります。私はもともと答えを削除しましたが、このアプローチが便利なので、削除しなかったすべてのオプションを表示することができます。

1
select 
    Value.value('(eForm/page/Belief/item[@selected="True"])[1]/@value', 'nvarchar(max)')  
from test 

sql fiddle demo

関連する問題