- ์นดํ ๊ณ ๋ฆฌ:
XMLGETยถ
์ง์ ๋ ํ๊ทธ์ ์ด๋ฆ๊ณผ ์ธ์คํด์ค ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ๋ถ XML ์์์ ๋ด์ฉ์์ XML ์์ ์ค๋ธ์ ํธ(์ข ์ข ๊ฐ๋จํ ํ๊ทธ ๋ผ๊ณ ๋ ํจ)๋ฅผ ์ถ์ถํฉ๋๋ค.
(XML ํ๊ทธ๋ Snowflake ๋ฐ์ดํฐ ๊ฑฐ๋ฒ๋์ค ํ๊ทธ ์ ๋์ผํ์ง ์์ต๋๋ค.)
๊ตฌ๋ฌธยถ
XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
์ธ์ยถ
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') ...;
์ฝํ ์ธ ์์ ๋ด๋ถ ํ๊ทธ์ ์์น๋
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>');
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> | | |
+-------------------------+------------------------------+---------------------------------------------------+
์ด ์์์๋ GET ๊ณผ XMLGET ์ ํจ๊ป ์ฌ์ฉํ์ฌ ์์์ ๋ด์ฉ์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์์์ level2
ํ๊ทธ์๋ 3๊ฐ์ ํญ๋ชฉ(ํ
์คํธ 1๊ฐ ๋ฐ ์ค์ฒฉ ํ๊ทธ 2๊ฐ)์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก GET ์์๋ ์ด๋ฌํ ํญ๋ชฉ์ ARRAY ๋ก ๋ฐํํฉ๋๋ค. ์ค์ฒฉ ํ๊ทธ๋ OBJECTs(ํค-๊ฐ ํ์ด)๋ก ํ์๋ฉ๋๋ค. @
์์ฑ์ ์ค์ฒฉ๋ ํ๊ทธ ์ด๋ฆ์ ํฌํจํ๊ณ $
์์ฑ์ ์ค์ฒฉ๋ ํ๊ทธ ๋ด์ฉ์ ํฌํจํฉ๋๋ค.
SELECT object_col,
GET(XMLGET(object_col, 'level2'), '$') AS content_of_element
FROM xml_demo;
+-------------------------+--------------------+
| 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>');
SELECT object_col,
GET(XMLGET(object_col, 'level2'), '@an_attribute') AS attribute
FROM xml_demo
WHERE ID = 1002;
+--------------------------------------------------+----------------+
| OBJECT_COL | ATTRIBUTE |
|--------------------------------------------------+----------------|
| <level1> | "my attribute" |
| 1 | |
| <level2 an_attribute="my attribute">2</level2> | |
| </level1> | |
+--------------------------------------------------+----------------+
์ฐธ๊ณ
XMLGET ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ์ ๋ ๋ง์ ์๋ XML ์์ ์ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.