- カテゴリ:
- 半構造化データ関数と構造化データ関数 (抽出) 
XMLGET¶
指定されたタグの名前とインスタンス番号に基づいて、外側の XML 要素のコンテンツから XML 要素オブジェクト(たいていは単に タグ と呼ばれます)を抽出します。
(XML タグは、Snowflake データガバナンスタグ と同じではないことに注意してください。)
構文¶
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 です。
この関数は以下の場合に 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つのアイテム(テキストと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 協力の例 をご参照ください。