- カテゴリ:
半構造化データ関数と構造化データ関数 (抽出)
XMLGET¶
指定されたタグの名前とインスタンス番号に基づいて、外側の XML 要素のコンテンツから XML 要素オブジェクト(単に タグ と呼ばれることが多い)を抽出します。
(XML タグは、Snowflake データガバナンスタグ と同じではないことに注意してください。)
XMLGET の引数が NULLの場合、結果は NULLになります。
タグインスタンスが見つからない場合、結果は NULL になります。
構文¶
XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
引数¶
expression
要素を抽出するための式。
式は、 OBJECT (または OBJECT を含む VARIANT)に評価される必要があります。OBJECT には、Snowflakeがサポートする内部形式の有効な XML が含まれている必要があります。通常、これは OBJECT が次のいずれかによって生成されたことを意味します。
PARSE_XML 関数を呼び出すには、
データをロード(例: COPY INTO <テーブル> コマンドを使用)し、データが XML 形式であることを指定します。
VARCHAR に有効な XML テキストが含まれている場合でも、 XMLGET 関数は VARCHAR 式を直接操作しません。
tag_name
expression
に格納されている XML タグの名前。instance_number
XML に
tag_name
の複数のインスタンスが含まれている場合は、instance_number
を使用して、取得するインスタンスを指定します。配列インデックスと同様に、instance_number
は0ベースであり、1ベースではありません。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') ...;
コンテンツ内の内部タグの位置は、
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>');
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つのアイテム(テキストと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" |
| | } |
| | ] |
+-------------------------+----------------------------------------+
次の例は、 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')
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> | |
+--------------------------------------------------+----------------------------------------------------+