[XML]タイプの[abc]
という列があるテーブル[Information]
があるSQL Server 2012を使用しています。
この列には次のような値があります-
<Information>
<Groups>
<Group Name="Monitor">
<Items>
<Item>
<Name>Cid</Name>
<Value>2323232323</Value>
</Item>
<Item>
<Name>Tid</Name>
<Value>6656565656</Value>
</Item>
</Items>
</Group>
</Groups>
</Information>
この列をクエリしてさらに値[Tid]
を抽出できるSQLクエリを作成するにはどうすればよいですか?
ここで何をしたいかは、あなたの質問から完全に明確ではありません。私の推測では、_<Value>
_ノードがTid
である_<Name>
_ノードの値が必要だと思います。
_/Information/Groups/Group/Items/Item
_でnodes()
関数を使用してXMLを細断処理し、述語[Name/text()="Tid"]
を追加して_<Name>
_の値を確認します。
_declare @T table(X xml not null);
insert into @T(X) values
('<Information>
<Groups>
<Group Name="Monitor">
<Items>
<Item>
<Name>Cid</Name>
<Value>2323232323</Value>
</Item>
<Item>
<Name>Tid</Name>
<Value>6656565656</Value>
</Item>
</Items>
</Group>
</Groups>
</Information>');
select I.X.value('(Value/text())[1]', 'bigint') as Value
from @T as T
cross apply T.X.nodes('/Information/Groups/Group/Items/Item[Name/text()="Tid"]') as I(X);
_
必要な場合のみ<Name>Tid</Name>
、クエリは次のようになります。
DECLARE @x XML = N'
<Information>
<Groups>
<Group Name="Monitor">
<Items>
<Item>
<Name>Cid</Name>
<Value>2323232323</Value>
</Item>
<Item>
<Name>Tid</Name>
<Value>6656565656</Value>
</Item>
</Items>
</Group>
</Groups>
</Information>
';
DECLARE @x_table TABLE (x XML);
INSERT @x_table ( x )
VALUES ( @x );
SELECT ca.c.value('.', 'NVARCHAR(3)')
FROM @x_table AS x
CROSS APPLY x.x.nodes('/Information/Groups/Group/Items/Item/Name/text()') AS ca(c)
WHERE ca.c.exist('. [.="Tid"]') = 1;
他に必要な場合はお知らせください。