2017-12-14 6 views
2

xml形式のデータベースを取得し、特定の文字が見つかった場合は2つの属性値を反転するクエリを作成しようとしています。例えばので:xQueryのスワップ属性の値

<people> 
    <person name="Alice" age="20" team="developer" dep="red" version="old" /> 
    <person name="Sam" age="23" team="marketing" dep="blue" version="old" /> 
    <person name="Bob" age="21" team="sales" dep="green" version="new" /> 
</people> 

version="old"場合、私はチームと色の属性を反転します。だからアリスは次のようになります:

<person name="Alice" age="20" team="red" dep="developer" version="new" /> 

私は「古い」だけの行を返すデータベースを持っていますが、属性を置き換える方法はわかりません。あなたのSQL/XQueryのミックスは、XQueryのネイティブアップデート機能を使用している場合

UPDATE mDB 
     SET people.modify(' 
      for $p in (/people/person) 
       let $team := $p/@team 
       let $dep := $p/@dep 

       replace value of node 
        $p/@dep 
       with 
        $team 
       replace value of node 
        $p/@team 
       with 
        $dep 
     ') 
     FROM mDB 
     WHERE people.exist(' 
        for $p in (/people/person) 
         where contains(data($p/@version), "old") 
        return data($person/@version)') != 0 
+0

? 「SQL」はクエリ言語であり、特定のデータベース製品の名前ではありません。 –

+0

@a_horse_with_no_name SQL 2014 Service Pack 1を使用していますが、それは役に立ちますか? – moiraghan

+0

@a_horse_with_no_nameはい私はあります!申し訳ありません – moiraghan

答えて

0

は、私が言うことができないか、これはあなたのSQLのベンダーから来ているが、場合のドキュメントをざっと見てみると、あなたを教えてください。

あなたは現在、すなわちあなたが$p/@team$p/@depを交換する場合、結果はちょうど@dep@teamがで自分の順番を入れ替えることになり、あなたの希望は、属性の値を更新することでどのようなノードの値を更新するために、XQueryを伝えます出力。 <person team='x' dep='1'/><person dep='1' team='x'/>になります。ノードをそのままにしておく必要がありますが、属性の値を置き換えてください。このような何か:

for $p in people/person[@version = "old"] 
return 
    element person { 
     attribute name {data($p/@name)}, 
     attribute age {data($p/@age)}, 
     attribute team {data($p/@dep)}, (: <- note the switch :) 
     attribute dep {data($p/@team)}, (: <- s.a. :) 
     attribute version {data($p/@version)} 
    } 

は、所望の出力を生成します:

あなたは[DBMS](https://en.wikipedia.org/wiki/DBMS)製品を使用している
<person name="Alice" age="20" team="red" dep="developer" version="old"/> 
<person name="Sam" age="23" team="blue" dep="marketing" version="old"/> 
+0

これは私が欲しいものをやっているようです! ルーピング中にルート要素 'people'を返す方法がありますか?それとも別のクエリを実行する必要がありますか?ルート要素に属性を追加すると、ルート属性データを失うことなく、必要な人物要素を更新するにはどのようにすればよいでしょうか? – moiraghan

+0

'element person'を' element $ p/.. 'に置き換えてください。私の答えはあなたの例に基づいて新しい人物要素を構築しました。古い人物要素を再利用したい場合は、xpathの親ステップを使ってそこにアクセスできます。 – duncdrum