์นดํ…Œ๊ณ ๋ฆฌ:

๋ฐ˜์ •ํ˜• ๋ฐ ์ •ํ˜• ๋ฐ์ดํ„ฐ ํ•จ์ˆ˜ (์ถ”์ถœ)

XMLGETยถ

์ง€์ •๋œ ํƒœ๊ทธ์˜ ์ด๋ฆ„๊ณผ ์ธ์Šคํ„ด์Šค ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ธ๋ถ€ XML ์š”์†Œ์˜ ๋‚ด์šฉ์—์„œ XML ์š”์†Œ ์˜ค๋ธŒ์ ํŠธ(์ข…์ข… ๊ฐ„๋‹จํžˆ ํƒœ๊ทธ ๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

(XML ํƒœ๊ทธ๋Š” Snowflake ๋ฐ์ดํ„ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํƒœ๊ทธ ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ฐธ๊ณ  ํ•ญ๋ชฉ:

CHECK_XML, PARSE_XML, TO_XML

๊ตฌ๋ฌธยถ

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

์ธ์žยถ

expression

์š”์†Œ๋ฅผ ์ถ”์ถœํ•  ์‹์ž…๋‹ˆ๋‹ค.

์‹์€ OBJECT (๋˜๋Š” OBJECT๋ฅผ ํฌํ•จํ•˜๋Š” VARIANT)๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. OBJECT์—๋Š” Snowflake๊ฐ€ ์ง€์›ํ•˜๋Š” ๋‚ด๋ถ€ ํ˜•์‹์˜ ์œ ํšจํ•œ XML์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” OBJECT๊ฐ€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • PARSE_XML ํ•จ์ˆ˜ ํ˜ธ์ถœ.

  • ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ(์˜ˆ: COPY INTO <ํ…Œ์ด๋ธ”> ๋ช…๋ น์„ ํ†ตํ•ด) ๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ XML ํ˜•์‹์ž„์„ ์ง€์ •.

XMLGET ํ•จ์ˆ˜๋Š” VARCHAR์— ์œ ํšจํ•œ XML ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ VARCHAR ์‹์—์„œ ์ง์ ‘ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

tag_name

expression ์— ์ €์žฅ๋œ XML ํƒœ๊ทธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

instance_number

XML์— tag_name ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จ๋œ ๊ฒฝ์šฐ instance_number ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์ธ๋ฑ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, instance_number ๋Š” 1์ด ์•„๋‹Œ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

instance_number ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ 0์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ยถ

๋ฐ˜ํ™˜๋œ ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ OBJECT ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋Š” NULL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • XMLGET ์˜ ์ธ์ž๊ฐ€ NULL ์ธ ๊ฒฝ์šฐ.

  • ํƒœ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ๋ฒ• ๋…ธํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์šฉ๋ฒ• ๋…ธํŠธยถ

  • XMLGET ์˜ ๊ฒฐ๊ณผ๋Š” ํƒœ๊ทธ์˜ ๋‚ด์šฉ(์ฆ‰, ํƒœ๊ทธ ์‚ฌ์ด์˜ ํ…์ŠคํŠธ)์ด ์•„๋‹Œ ์ „์ฒด ์š”์†Œ(์—ฌ๋Š” ํƒœ๊ทธ, ๋‚ด์šฉ, ๋‹ซ๋Š” ํƒœ๊ทธ)์ž…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ 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 OR REPLACE 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;
Copy
+-------------------------+------------------------------+---------------------------------------------------+
| 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>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+

์ด ์˜ˆ์—์„œ๋Š” GET ๊ณผ XMLGET ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ์˜ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ์—์„œ level2 ํƒœ๊ทธ์—๋Š” 3๊ฐœ์˜ ํ•ญ๋ชฉ(ํ…์ŠคํŠธ 1๊ฐœ ๋ฐ ์ค‘์ฒฉ ํƒœ๊ทธ 2๊ฐœ)์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ GET ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์„ ARRAY ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ํƒœ๊ทธ๋Š” OBJECTs(ํ‚ค-๊ฐ’ ํŽ˜์–ด)๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. @ ์†์„ฑ์€ ์ค‘์ฒฉ๋œ ํƒœ๊ทธ ์ด๋ฆ„์„ ํฌํ•จํ•˜๊ณ  $ ์†์„ฑ์€ ์ค‘์ฒฉ๋œ ํƒœ๊ทธ ๋‚ด์šฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์˜ˆ์—์„œ๋Š” 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') AS attribute
  FROM xml_demo
  WHERE ID = 1002;
Copy
+--------------------------------------------------+----------------+
| OBJECT_COL                                       | ATTRIBUTE      |
|--------------------------------------------------+----------------|
| <level1>                                         | "my attribute" |
|   1                                              |                |
|   <level2 an_attribute="my attribute">2</level2> |                |
| </level1>                                        |                |
+--------------------------------------------------+----------------+

์ฐธ๊ณ 

XMLGET ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ๋” ๋งŽ์€ ์˜ˆ๋Š” XML ์ž‘์—…์˜ ์˜ˆ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.