2017-03-31 3 views
0

각 항목마다 1 씩 증가하는 요소 이름을 가진 테이블에서 XMLtype 필드를 쿼리하려고합니다. 이러한 요소가 1에서 여러 단계 일 수 있으며 요소 이름을 와일드 카드로 처리하는 방법이 있는지 궁금해서 모든 가능한 요소 이름을 결합하는 대신 이름 검색을 기반으로 모든 요소 값을 반환합니다. 나는이 단계를 이해 한 후에 listagg를 보거나 결과를 연결하려고합니다.Oracle에서 증가하는 XML 요소 이름 쿼리

<doc><name1>NAME_1</name1><name2>NAME_2</name2><name3>NAME_3</name3></doc> 

원하는 SQL 쿼리 VARCHAR 연결된 출력

"NAME_1,NAME_2,NAME_3" 
+0

샘플 XML 및 해당 데이터의 출력이 도움이 될 것입니다. –

+0

XML 및 SQL 출력 예제를 추가했습니다. – Jared

답변

2

당신은 012,391,144를 사용할 수있는 요소 이름에 와일드 카드 검색

select extractvalue(myXMLfield,'/doc/name%') from myTable 

XML 샘플의 일종 대

select extractvalue(myXMLfield,'/doc/name1') from myTable 
union 
select extractvalue(myXMLfield,'/doc/name2') from myTable 
union 
select extractvalue(myXMLfield,'/doc/name3') from myTable 

는 여러 노드 값을 추출하고,는 XPath의 문자열 패턴 (실제 데이터를 적절하게 열 크기를 설정) 노드 이름에 와일드 카드를 위해 :

select x.name 
from myTable t 
cross join XMLTable(
    '/doc/*[substring(name(), 1, 4) = "name"]' 
    passing myXMLfield 
    columns name varchar2(20) path '.' 
) x; 

NAME     
-------------------- 
NAME_1 
NAME_2 
NAME_3 

을 그리고 당신은 당신의 최종 출력 listagg()을 사용할 수 있습니다 :

select listagg(x.name, ',') within group (order by null) as names 
from myTable t 
cross join XMLTable(
    '/doc/*[substring(name(), 1, 4) = "name"]' 
    passing myXMLfield 
    columns name varchar2(20) path '.' 
) x; 

NAMES       
------------------------------ 
NAME_1,NAME_2,NAME_3 

null로 주문하십시오. 이상형입니다. 실제 데이터에 추출 할 수있는 다른 특성이나 값이있는 경우 더 나은 순서로 사용할 수 있습니다. 그렇지 않다면 '이름'다음에 부분을 사용할 수 있습니다. 다른 부분 문자열을 통해 실제로 숫자로 가정합니다.

select listagg(x.name, ',') within group (order by x.id) as names 
from myTable t 
cross join XMLTable(
    '/doc/*[substring(name(), 1, 4) = "name"]' 
    passing myXMLfield 
    columns name varchar2(20) path '.', 
    id number path 'substring(name(.), 5)' 
) x; 
+0

이것은 완벽하게 작동했습니다. 쿼리 성능도 꽤 괜찮습니다. 감사. – Jared