web-dev-qa-db-ja.com

XMLタイプのこのSQLクエリを作成する方法?

[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クエリを作成するにはどうすればよいですか?

6
Maximus

ここで何をしたいかは、あなたの質問から完全に明確ではありません。私の推測では、_<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);
_
10
Mikael Eriksson

必要な場合のみ<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;

他に必要な場合はお知らせください。

8
Erik Darling