2016-12-16 3 views
1

私は以下のXMLをMS SQLテーブルに格納しています。MS SQLの複数の要素からXMLを返す

<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="1" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected=""/> 
</CustomerStrategy> 

私はIsChampion = "0"IsSelected="true"GroupID="BureauPhoneTest"あるものを探しています。 CustomerStrategy要素には、他のチャンピオンの挑戦者要素が存在する可能性があります。

IsChampion = "0"IsSelected="true"GroupID="BureauPhoneTest"を返すようにSQLを構成するにはどうすればよいですか。

答えて

1

あなたは直接のようにXMLを扱うことができます:

DECLARE @x TABLE (
    id int, 
    xmlField xml 
) 

INSERT INTO @x VALUES 
(1, '<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="1" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected=""/> 
</CustomerStrategy>'), 
(2, '<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="1" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected="true"/> 
</CustomerStrategy>') 


SELECT DISTINCT x.id 
FROM @x x 
CROSS APPLY (
    SELECT xmlField 
    FROM xmlField.nodes('/CustomerStrategy/ChampionChallenger') as t(c) 
    WHERE t.c.value('@IsChampion','bit') = 0 
      and t.c.value('@IsSelected','nvarchar(6)') = 'true' 
      and t.c.value('@GroupId','nvarchar(50)') ='BureauPhoneTest'   
    ) as t 

これは2を返します。私は必要なすべての条件付きで1つの文字列を追加します。

+0

は、基本的に、我々はXMLを取り、の種類にそれを回っている、です一時テーブル。私は正しいですか? – user3179585

+0

私は「そう」ではなく「そう」を意味していました。 – user3179585

+0

ええ、あなたは正しい考えを持っています。 – gofr1

1

.nodes()の範囲内のフィルターをXQueryという式で挿入する方が良いです。

特に大きなXMLの場合は、最初はすべてを読みすぎて、最後をフィルタリングするのは難しいです。

idのNULLを返します。以下= 1、ID = 2のための1つのXMLとidの2つのエントリ= 3:

DECLARE @tbl TABLE (id int,xmlField xml); 
INSERT INTO @tbl VALUES 
(1, '<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="1" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected=""/> 
</CustomerStrategy>'), 
(2, '<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="1" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected="true"/> 
</CustomerStrategy>'), 
(3, '<CustomerStrategy> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Champion" IsSelected="true" /> 
    <ChampionChallenger GroupId="BureauPhoneTest" IsChampion="0" StrategyName="New Bureau Phone Challenger" IsSelected="true"/> 
</CustomerStrategy>'); 

SELECT t.id 
     ,Filtered.query('.') AS FilteredNodes 
FROM @tbl AS t 
OUTER APPLY xmlField.nodes(N'/CustomerStrategy/ChampionChallenger[@IsChampion eq "0" and @IsSelected eq "true" and @GroupId eq "BureauPhoneTest"]') AS A(Filtered) 
関連する問題