[SQL] XQuery로 XML Data에 접근하기

XQuery는 XML을 조회한다는 개념에서 한발 더 나아가 직접 XML Data에 접근할 수 있도록 해줍니다. 이때 어떠한 방식으로 접근하느냐에 따라 3가지 형식으로 나뉩니다.

우선 XQuery를 사용하기 전에 먼저 Sample XML Data를 만든 후 이 XML Data를 대상으로 XQuery를 적용시켜 보도록 하겠습니다.
 

Declare @MyXml Xml;
Set @MyXml = '
< TopEle>
< Department ID="1">
  <Names Nm="Engineering">
    <Group>
      <Name>Research and Development</Name>
    </Group>
  </Names>
< /Department>
< Department ID="2">
  <Names Nm="Tool Design">
    <Group>
      <Name>Research and Development</Name>
    </Group>
  </Names>
< /Department>
< Department ID="3">
  <Names Nm="Sales">
    <Group>
      <Name>Sales and Marketing</Name>
    </Group>
  </Names>
< /Department>
< /TopEle>';


1. query

XML Data의 요소를 얻어오는데 사용되는 method입니다.
 

Select @MyXml.query('/TopEle[1]/Department[2]');


Data형식이 XML이면 그것이 변수든 Column이든 상관없이 XQuery를 적용시킬 수 있습니다. 위에서는 @MyXml 변수에 XQuery의 query를 적용시켜 원하는 요소를 가져오도록 하였습니다.

먼저 /TopEle[1]을 통해 첫번째 TopEle요소의 하위 Department요소중 두번째 요소(/Department[2])내용을 가져오도록 합니다. 보시는 바와 같이 각 요소는 '/'문자로 구분하며 요소의 순서는 []안에 지정합니다.
 


이번에는 변수를 사용하여 XML문서내에 있는 각 Name의 요소값을 가져와 보겠습니다.
 

Select @MyXml.query('for $s in /TopEle/Department/Names/Group/Name return data($s)');


query내에 있는 for는 반복을 의미합니다. 즉, XML의  /Top /TopEle/Department/Names/Group/Name요소를 반복적으로 모두 확인하여 변수 $s에 넣고(data($s)) 그 결과를 출력하도록 하는 것입니다.
 

주의 :
XQuery사용시 대/소문자를 명확히 구분합니다. 예를 들어 for를 For라고 하면 오류가 발생합니다.

 


이번에는 요소의 값이 아니라 속성의 값을 가져와 보도록 하겠습니다.
 

Select @MyXml.query('for $s in /TopEle/Department/@ID return data($s)');
Select @MyXml.query('for $s in /TopEle/Department/Names/@Nm return data($s)');


첫번째 XQuery에서는 /TopEle/Department의 ID속성값을 가져오도록 하였고 두번째 XQuery에서는 /TopEle/Department/Names요소의 Nm속성값을 가져오도록 하였습니다.

여기서 '/'는 요소를, '@'는 속성을 의미합니다.
 


또한 XQuery는 XML Data에서 다음처럼 조건에 맞는 내용만 가져올 수도 있습니다.
 

Select @MyXml.query('for $s in /TopEle/Department[@ID eq "2"] return $s');


/TopEle/Department요소의 ID속성을 찾아서 값이 2인것만([@ID eq "2"]) 가져오도록 합니다. (XQuery조건문으로 일치하는 값을 지정할 수 있도록 합니다.)
 

참고 :
Data($s)를 통해서 값을 가져오는 경우는 해당 변수에 특정 값이 존재할때만 가능합니다. 위에서 제시된 예제는 특정 값이 아니라 XML Data자체이므로 data()를 쓰지 않습니다.

 


다음은 다른 XML구문을 추가하여 조회하는 예제입니다.
 

Select @MyXml.query('for $s in /TopEle/Department return <myXml><NewValue>{data($s/@ID)}</NewValue><NewString>{data($s/Names/@Nm)}</NewString></myXml>');


XQuery결과에 상위 <myXml>요소를 추가하고 각 값마다 <NewValue>요소와 <NewString>요소를 추가하여 XML형태로 결과값을 반환하도록 하고 있으며 동시에 두가지 값을 가져오는 방법도 제시하고 있습니다.

이때 주목해야할 부분이 있는데 두번째 data($s/Names/@Nm)부분을 보시면 for에서 in다음에 /TopEle/Department요소를 지정하여 궁극적으로는 Nmes요소의 Nm속성값을 가져올 수 없을지도 모르지만 이렇게 값을 반환하는 부분에서 하위 요소와 속성을 지정하면(/Names/@Nm) 해당 요소와 속성의 값을 가져올 수 있게 됩니다.
 


2. value

query는 XML data내에서 각 요소자체를 주출하는 역활을 하지만  value는 요소가 아닌 값만을 가져올 수 있도록 합니다.
 

Select @MyXml.value('(/TopEle/Department[3])[1]', 'Char(50)');


TopEle전체요소중에서 Department세번째 요소에 있는 첫번째 값을 Char(50) Data형으로 가져옵니다.
 


value를 사용하면 단순히 값을 가져오는것 이외에 실제 값이 있는가 없는가를 판단할 수도 있습니다.
 

Select @MyXml.value('some $s in /TopEle/Department/Names satisfies $s/@Nm="Sales"', 'Char(50)');


some을 통해 /TopEle/Department/Names요소의 Nm속성값에 "Sales"가 있으면 true 없으면 false를 반환합니다. (비교자는 satisfies를 사용합니다.)
 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com


값을 비교하여 있는지 없는지 판단하는 것은 some이외에 every도 있습니다. some은 값 비교시에 해당 값이 있는 요소가 하나라도 일치하면 true가 되지만 every는 전 요소가 모두 주어진 조건에 일치해야만 true가 됩니다.
 

Select @MyXml.value('every $s in /TopEle/Department/Names satisfies $s/@Nm="Sales"', 'Char(50)');


Nm속성이 "Sales"라고 되어 있는건 Department/Names의 세번째 요소에서만 일치하므로 결과는 false입니다.
 


3. exist

values로는 값이 있는지 없는지를 확인할 수 있지만 exist는 요소자체가 있는지 없는지를 판단할 수 있습니다.
 

Select @MyXml.exist('/TopEle/Department');


/TopEle요소 하위에 Department요소가 있는지 판단한 후 있으면 1 없으면 0을 반환합니다.
 


4. modify

XML에 접근하여 실제 XML Data를 추가/변경/삭제 할 수 있는 mothod입니다.

(1) 추가
 

Set @MyXml.modify('insert <newstart>spadework</newstart> as first into /');
Set @MyXml.modify('insert <newend>spadework</newend> as last into /');


< newstart>spadework</newstart>요소와 값을 해당 XML Data의 가장 처음(as first into)에 추가하고 <newend>spadework</newend>를 해당 XML Data의 가장 마지막(as last into)에 추가합니다.
 

 

Set @MyXml.modify('insert <TopEle mytag="new"/> as first into /TopEle[1]');


< TopEle mytag="new"/>요소와 속성을 TopEle요소의 처음부분에 추가합니다.
 

 

Set @MyXml.modify('insert <TopEle mytag="new"/> as last into /TopEle[1]/Department[3]');


< TopEle mytag="new"/>요소와 속성을 TopEle/Department 3번째 요소의 마지막에 추가합니다.
 


(2) 변경
 

Set @MyXml.modify('replace value of /TopEle[1]/Department[3]/Names[1]/@Nm with "abc"');


replace value of 를 통해 TopEle/Department 세번째요소의 Names요소에서 Nm속성값을 abc로 변경합니다.
 


(3) 삭제
 

Set @MyXml.modify('delete /TopEle[1]/Department[2]');


delete를 통해 /TopEle/Department 2번째 요소 전체를 삭제하도록 합니다.
 

 

[출처] http://lab.cliel.com/entry/SQL-XQuery%EB%A1%9C-XML-Data%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86174
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78664
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95397
58 Tutorial: Using Apache Zeppelin with MySQL file 졸리운_곰 2017.02.03 1790
57 VCNC가 Hadoop대신 Spark를 선택한 이유 file 졸리운_곰 2017.02.03 1299
56 2017년에 버려질 빅데이터 도구 7가지 file 졸리운_곰 2017.01.30 1356
55 Real-time stream processing: The next step for Apache Flink file 졸리운_곰 2016.08.10 1479
54 Stream Processing with Apache Flink file 졸리운_곰 2016.08.10 1502
53 실시간 빅 데이터(Real-time Big Data) 프로세싱 맛보기 졸리운_곰 2016.07.18 1490
52 실시간 빅데이터는 어떻게 분석할까 file 졸리운_곰 2016.07.18 1457
51 ZooKeeper란 무엇인가? file 졸리운_곰 2016.07.16 1570
50 대충보는 Storm #6-Apache Storm 그룹핑 개념 이해하기 file 졸리운_곰 2016.06.19 1316
49 대충보는 Storm #5-Apache Storm 병렬 분산 처리 이해하기 file 졸리운_곰 2016.06.19 1484
48 대충보는 Storm #4-Apache Storm 특징과 기본 개념 file 졸리운_곰 2016.06.19 1600
47 대충보는 Storm #3-Storm 싱글 클러스터 노드 설치 및 배포 file 졸리운_곰 2016.06.19 1329
46 대충보는 Storm #2-Storm 설치와 HelloStorm 작성하기 file 졸리운_곰 2016.06.19 1401
45 Storm을 이용한 실시간 데이타 처리 #1-데이타 스트림 개념 이해하기 file 졸리운_곰 2016.06.19 1106
44 Spark를 설치해서 무작정 돌려보자. file 졸리운_곰 2016.06.12 1920
43 빅데이터 분석에 스파크를 이용해야 하는 5가지 이유 file 졸리운_곰 2016.06.12 1371
42 실시간 'BI'를 실행하라, 스톰과 스파크 설명과 그 선택 방법 file 졸리운_곰 2016.06.12 1372
41 [Cloudera 블로그 번역] Spark 활용하기 : 빅데이터 어플리케이션용 고속 인메모리 컴퓨팅 file 졸리운_곰 2016.06.12 1797
40 [kafka] Producer 구현하기 졸리운_곰 2016.06.05 1525
39 [kafka] Consumer Group Example 졸리운_곰 2016.06.05 1837
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED