카테고리:

반정형 및 정형 데이터 함수 (추출)

XMLGET

지정된 태그의 이름과 인스턴스 번호를 기준으로 외부 XML 요소의 내용에서 XML 요소 오브젝트(종종 간단히 태그 라고도 함)를 추출합니다.

(XML 태그는 Snowflake 데이터 거버넌스 태그 와 동일하지 않습니다.)

  • XMLGET의 어떤 인자가 NULL인 경우, 결과는 NULL입니다.

  • 태그 인스턴스를 찾을 수 없는 경우, 결과는 NULL입니다.

구문

XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
Copy

인자

expression

요소를 추출할 식입니다.

식은 OBJECT (또는 OBJECT를 포함하는 VARIANT)로 평가되어야 합니다. OBJECT에는 Snowflake가 지원하는 내부 형식의 유효한 XML이 포함되어야 합니다. 일반적으로 이는 OBJECT가 다음 중 하나에 의해 생성되었음을 의미합니다.

XMLGET 함수는 VARCHAR에 유효한 XML 텍스트가 포함되어 있어도 VARCHAR 식에서 직접 작동하지 않습니다.

tag_name

expression 에 저장된 XML 태그의 이름입니다.

instance_number

XML에 tag_name 의 인스턴스가 여러 개 포함된 경우 instance_number 를 사용하여 검색할 인스턴스를 지정합니다. 배열 인덱스와 마찬가지로, instance_number 는 1이 아닌 0부터 시작합니다.

instance_number 는 생략할 수 있으며, 이 경우 기본값 0이 사용됩니다.

반환

반환된 값의 데이터 타입은 OBJECT 입니다.

자세한 내용은 사용법 노트를 참조하십시오.

사용법 노트

  • XMLGET의 결과는 태그의 내용(즉, 태그 사이의 텍스트)이 아닌 전체 요소(여는 태그, 내용, 닫는 태그)입니다. 반환 값은 OBJECT 입니다. 이 OBJECT에서는 GET 함수를 사용하여 태그 이름, 태그의 속성 값 및 요소의 내용(중첩 태그 포함)을 추출할 수 있습니다.

    • 속성 값을 추출하려면 GET(tag, '@attrname') 을 사용하십시오.

    • 내용을 추출하려면 GET(tag, '$') 를 사용하십시오.

    • 태그 이름을 추출하려면 GET(tag, '@') 을 사용하십시오.

  • XMLGET() 호출을 중첩하여 중첩 태그를 추출할 수 있습니다. 예:

    select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • 콘텐츠에서 내부 태그의 위치는 GET(tag, 'inner-tag-name') 을 사용하여 얻을 수 있습니다. 콘텐츠에 여러 요소가 포함된 경우, 위치는 배열로 표시됩니다.

  • XMLGET을 사용하면 가장 바깥쪽 요소를 추출할 수 없습니다. 가장 바깥쪽 요소를 가져오려면 expression 자체를 선택하면 됩니다.

다음 예에서는 XML이 포함된 OBJECT가 있는 테이블을 생성한 후 XMLGET()를 사용하여 해당 OBJECT에서 요소를 추출합니다.

CREATE TABLE xml_demo (ID INTEGER, object_col OBJECT);
INSERT INTO xml_demo (id, object_col)
    SELECT 1001,
        PARSE_XML('<level1> 1 <level2> 2 <level3> 3A </level3> <level3> 3B </level3> </level2> </level1>');
Copy
SELECT object_col,
       XMLGET(object_col, 'level2'),
       XMLGET(XMLGET(object_col, 'level2'), 'level3', 1)
    FROM xml_demo;
+-------------------------+------------------------------+---------------------------------------------------+
| OBJECT_COL              | XMLGET(OBJECT_COL, 'LEVEL2') | XMLGET(XMLGET(OBJECT_COL, 'LEVEL2'), 'LEVEL3', 1) |
|-------------------------+------------------------------+---------------------------------------------------|
| <level1>                | <level2>                     | <level3>3B</level3>                               |
|   1                     |   2                          |                                                   |
|   <level2>              |   <level3>3A</level3>        |                                                   |
|     2                   |   <level3>3B</level3>        |                                                   |
|     <level3>3A</level3> | </level2>                    |                                                   |
|     <level3>3B</level3> |                              |                                                   |
|   </level2>             |                              |                                                   |
| </level1>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+
Copy

이 예에서는 GET()과 XMLGET()을 함께 사용하여 요소의 내용을 검색하는 방법을 보여줍니다. 이 예에서 level2 태그에는 3개의 항목(텍스트 1개 및 중첩 태그 2개)이 포함되어 있으므로 GET에서는 이러한 항목을 ARRAY 로 반환합니다. 중첩 태그는 OBJECTs(키-값 페어)로 표시됩니다. @ 속성은 중첩된 태그 이름을 포함하고 $ 속성은 중첩된 태그 내용을 포함합니다.

SELECT object_col,
       GET(XMLGET(object_col, 'level2'), '$')
    FROM xml_demo;
+-------------------------+----------------------------------------+
| OBJECT_COL              | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '$') |
|-------------------------+----------------------------------------|
| <level1>                | [                                      |
|   1                     |   2,                                   |
|   <level2>              |   {                                    |
|     2                   |     "$": "3A",                         |
|     <level3>3A</level3> |     "@": "level3"                      |
|     <level3>3B</level3> |   },                                   |
|   </level2>             |   {                                    |
| </level1>               |     "$": "3B",                         |
|                         |     "@": "level3"                      |
|                         |   }                                    |
|                         | ]                                      |
+-------------------------+----------------------------------------+
Copy

이 예에서는 GET()과 함께 XMLGET()을 사용하여 태그의 속성을 검색하는 방법을 보여줍니다.

INSERT INTO xml_demo (id, object_col)
    SELECT 1002,
        PARSE_XML('<level1> 1 <level2 an_attribute="my attribute"> 2 </level2> </level1>');
Copy
SELECT object_col,
       GET(XMLGET(object_col, 'level2'), '@an_attribute')
    FROM xml_demo
    WHERE ID = 1002;
+--------------------------------------------------+----------------------------------------------------+
| OBJECT_COL                                       | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '@AN_ATTRIBUTE') |
|--------------------------------------------------+----------------------------------------------------|
| <level1>                                         | "my attribute"                                     |
|   1                                              |                                                    |
|   <level2 an_attribute="my attribute">2</level2> |                                                    |
| </level1>                                        |                                                    |
+--------------------------------------------------+----------------------------------------------------+
Copy