Catégories :

Fonctions de données semi-structurées et structurées (Extraction)

XMLGET

Extrait un objet de l’élément XML (souvent appelé simplement balise) du contenu de l’élément XML extérieur en fonction du nom et du numéro d’instance de la balise spécifiée.

(Notez qu’une balise XML n’est pas la même qu’une balise de gouvernance des données Snowflake).

Voir aussi :

CHECK_XML, PARSE_XML, TO_XML

Syntaxe

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

Arguments

expression

L’expression dont on doit extraire l’élément.

L’expression doit correspondre à OBJECT (ou un VARIANT contenant un OBJECT). L’OBJECT doit contenir du XML valide dans le format interne que Snowflake prend en charge. Typiquement, cela signifie que l’OBJECT a été produit par l’un des éléments suivants :

  • Un appel de la fonction PARSE_XML.

  • Le chargement des données (par exemple, via la commande COPY INTO <table>) et la spécification que les données sont au format XML.

La fonction XMLGET n’opère pas directement sur une expression VARCHAR même si ce VARCHAR contient du texte XML valide.

tag_name

Le nom d’une balise XML stockée dans l”expression.

instance_number

Si le fichier XML contient plusieurs instances de tag_name, utilisez instance_number pour spécifier l’instance à récupérer. Comme un index de tableau, le instance_number est basé sur 0 et non sur 1.

instance_number peut être omis, auquel cas la valeur par défaut 0 est utilisée.

Renvoie

Le type de données de la valeur renvoyée est OBJECT.

La fonction renvoie NULL dans les cas suivants :

  • Si un argument de XMLGET est NULL.

  • Si l’instance de la balise n’est pas trouvée.

Voir les notes sur l’utilisation pour plus d’informations.

Notes sur l’utilisation

  • Le résultat de XMLGET n’est pas le contenu de la balise (c’est-à-dire le texte entre les balises), mais l’élément entier (la balise ouvrante, le contenu et la balise fermante). À partir de la valeur OBJECT renvoyée, vous pouvez extraire le nom de la balise, les valeurs des attributs de la balise et le contenu de l’élément (y compris les balises imbriquées) à l’aide de la fonction GET :

    • Pour extraire les valeurs d’attribut, utilisez GET(tag, '@attrname').

    • Pour extraire le contenu, utilisez GET(tag, '$').

    • Pour extraire le nom du tag, utilisez GET(tag, '@').

  • Vous pouvez extraire des balises imbriquées en imbriquant des appels de fonctions XMLGET. Par exemple :

    SELECT XMLGET(XMLGET(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • Les positions des balises internes dans le contenu peuvent être obtenues en utilisant GET(tag, 'inner-tag-name'). Si le contenu contient plusieurs éléments, les positions sont représentées sous forme de tableau.

  • Vous ne pouvez pas utiliser XMLGET pour extraire l’élément le plus éloigné. Pour obtenir l’élément le plus éloigné, sélectionnez expression.

Exemples

L’exemple suivant crée une table avec un OBJECT qui contient du XML, puis utilise la fonction XMLGET pour extraire des éléments de cet 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>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+

Cet exemple montre comment utiliser GET avec XMLGET pour récupérer le contenu d’un élément. Dans l’exemple, la balise level2 contient trois éléments (du texte et deux balises imbriquées), donc GET renvoie ces éléments dans un ARRAY. Les balises imbriquées sont représentées par des OBJECTs (paires clé-valeur). La propriété @ contient le nom de la balise imbriquée et la propriété $ contient le contenu de la balise imbriquée.

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"  |
|                         |   }                |
|                         | ]                  |
+-------------------------+--------------------+

Cet exemple montre comment utiliser GET avec XMLGET pour récupérer un attribut d’une balise.

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>                                        |                |
+--------------------------------------------------+----------------+

Note

Pour d’autres exemples de requêtes utilisant la fonction XMLGET, voir Exemples d’utilisation de XML.