2017-11-28 4 views
1

하나의 열에 XML 문자열이 저장되는 SAP HANA에 데이터베이스 테이블이 있습니다. 그냥 <PROPERTY NAME="NAME"></PROPERTY>이라는 태그에 저장된 값 하나가 필요합니다. 해당 이름의 태그가 여러 개 있습니다. 나는 최고가 필요해. XML은 다음과 같습니다SAP HANA에서 SQL을 통해 XML 값을 추출하는 방법은 무엇입니까?

<?xml version="1.0"?> 
<LINK_PROCESS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" LINK_TYPE="LINK"> 
    <PROPERTY NAME="NAME">Import XY Data</PROPERTY> 
    <PROPERTY NAME="DESCRIPTION">Import XY Data from File</PROPERTY> 
    <PROPERTY NAME="ID">DKV8Y051VOKNVE7MRRYE4AXYK</PROPERTY> 
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE"> 
     <PROPERTY NAME="NAME">Import XY</PROPERTY> 
     <PROPERTY NAME="DESCRIPTION">Import XY Data</PROPERTY> 
     <PROPERTY NAME="ID">04F3E61B5612439397CE76E3EC271598</PROPERTY> 
    </LINK_PROCESS> 
    <LINK_PROCESS LINK_TYPE="BPC_LINK"> 
     <PROPERTY NAME="NAME">XYZ</PROPERTY> 
     <PROPERTY NAME="DESCRIPTION">XYZ Data</PROPERTY> 
     <PROPERTY NAME="ID">7319D3A0196D4510924D32988B189A8E</PROPERTY> 
    </LINK_PROCESS> 
</LINK_PROCESS> 

내가 값 가져 오기 XY 데이터 아무것도 더 얻을 싶습니다. SAP HANA SQL을 통해 전체 XML 문자열 대신 태그 사이의 값을 추출하는 방법을 통해이를 어떻게 추출 할 수 있습니까?

+1

사용하는 HANA의 버전? 2.0 SPS01과 SPS02는'SELECT ... FROM XMLTABLE'에 대한 지원을 추가하여 여러분의 삶을 훨씬 쉽게 만들어줍니다 ... – mjturner

+0

우리는 HANA 1.0 SP12 –

답변

2

SAP HANA 1 (SPS12)은 XML 표현식/문서를 직접 사용하는 방법을 제공하지 않습니다. @mjturner가 이미 언급했듯이 HANA 2에서는 XML 처리 내장 함수를 제공하여 이러한 상황이 개선되었습니다.

즉, 관심있는 가치를 얻으려면 XML 처리 방식을 고안해야합니다. 올바른 XML 구문 분석기를 작성하는 것은 SQLScript에서 수행하려는 작업을 넘어서는 것이므로 권장 할만한 작업입니다. 시도하지 않으려면 .

대신, LINK_PROCESS type LINK -tag 다음에 NAME 태그에있는 문자열을 볼 수있는 옵션이 될 수 :이 구조는 HANA SPS12가하는 정규 표현식과 SAP를 통해 조회 할 수

<LINK_PROCESS ... LINK_TYPE="LINK"> 
<PROPERTY NAME="NAME">Import XY Data</PROPERTY> 
         ^^^^^^^^^^^^^^ 
이를 위해 SUBSTRING_REGEXPR() ( reference documentation) 기능을 지원하십시오.

해당 구조와 일치하는 정규식 예제는 https://regex101.com/r/k5FVqU/1을 참조하십시오.

과 같이 할 수 HANA SQL로 퍼팅 :

with data as (

    SELECT '<?xml version="1.0"?> 
    <LINK_PROCESS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" LINK_TYPE="LINK"> 
    <PROPERTY NAME="NAME">Import XY Data</PROPERTY> 
    <PROPERTY NAME="DESCRIPTION">Import XY Data from File</PROPERTY> 
    <PROPERTY NAME="ID">DKV8Y051VOKNVE7MRRYE4AXYK</PROPERTY> 
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE"> 
     <PROPERTY NAME="NAME">Import XY</PROPERTY> 
     <PROPERTY NAME="DESCRIPTION">Import XY Data</PROPERTY> 
     <PROPERTY NAME="ID">04F3E61B5612439397CE76E3EC271598</PROPERTY> 
    </LINK_PROCESS> 
    <LINK_PROCESS LINK_TYPE="BPC_LINK"> 
     <PROPERTY NAME="NAME">XYZ</PROPERTY> 
     <PROPERTY NAME="DESCRIPTION">XYZ Data</PROPERTY> 
     <PROPERTY NAME="ID">7319D3A0196D4510924D32988B189A8E</PROPERTY> 
    </LINK_PROCESS> 
</LINK_PROCESS>' as XML_DATA FROM DUMMY 
) 

SELECT 
    SUBSTR_REGEXPR('(<LINK_PROCESS.*LINK_TYPE="LINK">)\s*(<PROPERTY.*NAME="NAME">)(.*)(<\/PROPERTY>)' 
        FLAG 'in' 
        IN "XML_DATA" 
        GROUP 3) 
from data; 

가져 오기 XY 데이터