2017-12-14 20 views
2

XML 형식의 데이터베이스를 가져오고 특정 문자가있는 경우 두 개의 속성 값을 뒤집는 쿼리를 작성하려고합니다. 그래서 예를 들면 :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" /> 

"old"만있는 행을 반환하는 데이터베이스가 있지만 속성을 바꾸는 방법을 모르겠습니다. 당신의 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

어느 [DBMS] (https://en.wikipedia.org/wiki/DBMS) 제품 사용중인 :

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)} } 

원하는 출력을 생성? "SQL"은 쿼리 언어 일뿐 특정 데이터베이스 제품의 이름은 아닙니다. –

+0

@a_horse_with_no_name SQL 2014, 서비스 팩 1을 사용하고 있습니다. 도움이됩니까? – moiraghan

+0

@a_horse_with_no_name 예! 죄송합니다 – moiraghan

답변

0

는 어떻게 알 수 없거나이 당신의 SQL 공급 업체에서 제공되지만 경우 문서 얼핏 당신에게 말할 것이다.

현재 결과는 단지 @dep과 자신의 순서를 전환 @team 것을하게 될 희망은 당신이 $p/@team$p/@dep을 대체하는 경우, 즉 속성의 값을 업데이트하는 것입니다 무엇 노드의 값을 업데이트하는 XQuery를 말해 산출. <person team='x' dep='1'/><person dep='1' team='x'/>이됩니다. 노드를 그대로 유지해야하지만 속성 값만 바꿉니다. 이런 식으로 뭔가 :

<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/.. '로 대체하십시오. 내 대답은 당신의 예제를 기반으로 새로운 person 요소를 구성했습니다. 만약 old people 요소를 재사용하고 싶다면, xpath parent steps을 사용하면 거기에 도착할 수 있습니다. – duncdrum