カテゴリ:

半構造化データ関数と構造化データ関数 (抽出)

XMLGET

指定されたタグの名前とインスタンス番号に基づいて、外側の XML 要素のコンテンツから XML 要素オブジェクト(単に タグ と呼ばれることが多い)を抽出します。

(XML タグは、Snowflake データガバナンスタグ と同じではないことに注意してください。)

  • XMLGET の引数が NULLの場合、結果は NULLになります。

  • タグインスタンスが見つからない場合、結果は NULL になります。

構文

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

引数

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') ...;
    
    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つのアイテム(テキストと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