カテゴリ:

半構造化データ関数と構造化データ関数 (解析)

PARSE_XML

入力文字列を XML ドキュメントとして解釈し、 OBJECT 値を生成します。入力が NULL の場合、出力は NULL です。

こちらもご参照ください。

CHECK_XMLTO_XMLXMLGET

構文

PARSE_XML( <string_containing_xml> [ , <disable_auto_convert> ] )
Copy
PARSE_XML( STR => <string_containing_xml>
  [ , DISABLE_AUTO_CONVERT => <disable_auto_convert> ] )
Copy

引数

必須:

string_containing_xml . OR . STR => string_containing_xml

有効な XML を含む VARCHAR 値に評価される式を指定します。

オプション:

disable_auto_convert . OR . DISABLE_AUTO_CONVERT => disable_auto_convert

関数が string_containing_xml の数値およびブール値をSnowflakeデータ型に変換するかどうかを指定するブール式。(この変換の詳細については、以下の 使用上の注意 をご参照ください)。

  • 関数にこれらの値を変換 させたくない 場合は、この引数を TRUE に設定します。この設定は、 CREATE FILE FORMATDISABLE_AUTO_CONVERT パラメーターに似た効果があります。

  • 関数にこれらの値を変換させたい場合は、この引数を FALSE に設定するか、この引数を省略します。

デフォルト: FALSE

戻り値

戻り値のデータ型は OBJECT です。OBJECT には、 XML の内部表現が含まれています。

使用上の注意

  • すべての引数を名前または位置のいずれかで指定する必要があります。一部の引数を名前で、他の引数を位置で指定することはできません。

    引数を名前で指定する場合は、引数名を二重引用符で囲むことはできません。

  • XML ドキュメントにある要素のコンテンツはすべてテキストです。PARSE_XML は、一部の XML データをテキストからネイティブ(Snowflake SQL)に変換しようとします。詳細については、 SQL データ型リファレンス をご参照ください。

    • NUMERIC および BOOLEAN:

      PARSE_XML は、明らかに数値およびブールである値を、これらの値が印刷されると、テキスト上で同一の結果が生成されるネイティブ表現に変換しようとします。たとえば、10進数を解析するとき、 PARSE_XML は、123.45を DOUBLEではなく NUMBER(5,2)として処理することにより、表現の正確さを保持しようとします。ただし、

      • 科学表記法の数値(1.2345e +02など)、または範囲またはスケールの制限のために固定小数点として保存できない数値は、 DOUBLE として保存されます。

      • XML 要素の内容が小数点以下の数字の場合、 PARSE_XML は後続のゼロを切り捨てる可能性があります。

      関数でこの変換を実行しない場合は、 disable_auto_convert 引数に TRUE を渡します。

    • TIMESTAMP, DATE, TIME, BINARY:

      XML は、 TIMESTAMP、 DATE、 TIME、 BINARY のような値をネイティブに表現しないため、これらは XML で文字列として表現する必要があります。PARSE_XML はこれらの値を自動的に認識しません。これらは文字列として保持されるため、必要に応じて値を文字列からネイティブな SQL データ型に変換してください。

  • XML 属性は、名前/値のペアの 順不同 コレクションです。PARSE_XML 関数は必ずしも順序を保持しません。たとえば、テキストを XML に変換してからテキストに戻すと、異なる順序で元の情報を含む文字列が生成される場合があります。

  • 文字列から XML に変換する際に、要素間の空白に変化が見られる場合があります。

  • PARSE_XML を使用して整数値(例えば、 INT や INTEGER)と10進数表記値(例えば、 NUMBER や FLOAT)が混在している 数値 を VARIANT 列に挿入する場合、関数は値に後続するゼロを追加することがあります。

    以下の例では、 PARSE_XML を使用して、 VARIANT 列に整数値と10進数表記の値を混ぜて挿入しています。

    CREATE OR REPLACE TABLE test_xml_table(xmlcol VARIANT);
    
    INSERT INTO test_xml_table (
      SELECT PARSE_XML($1) FROM VALUES
        ('<c>3.1</c>'),
        ('<e>2</e>'),
        ('<b>0.123</b>'));
    
    Copy

    テーブルをクエリします。

    SELECT * FROM test_xml_table;
    
    Copy
    +--------------+
    | XMLCOL       |
    |--------------|
    | <c>3.100</c> |
    | <e>2.000</e> |
    | <b>0.123</b> |
    +--------------+
    

    出力は、最初の2行の値に後続するゼロが追加されていることを示しています。

次の例は、 PARSE_XML 関数を使用して XML の文字列を OBJECT 列に挿入できる OBJECT に変換する方法を示しています。

CREATE OR REPLACE TABLE xtab (v OBJECT);

INSERT INTO xtab SELECT PARSE_XML(column1) AS v
  FROM VALUES ('<a/>'), ('<a attr="123">text</a>'), ('<a><b>X</b><b>Y</b></a>');

SELECT * FROM xtab;
Copy
+------------------------+
| V                      |
|------------------------|
| <a></a>                |
| <a attr="123">text</a> |
| <a>                    |
|   <b>X</b>             |
|   <b>Y</b>             |
| </a>                   |
+------------------------+

次の例は、数値の変換を使用する場合と無効にする場合の違いを示しています。この例では、変換が無効になっていない場合、関数は科学的記数法の数値を DOUBLE として解釈します。

SELECT PARSE_XML('<test>22257e111</test>'), PARSE_XML('<test>22257e111</test>', TRUE);
Copy
+-------------------------------------+-------------------------------------------+
| PARSE_XML('<TEST>22257E111</TEST>') | PARSE_XML('<TEST>22257E111</TEST>', TRUE) |
|-------------------------------------+-------------------------------------------|
| <test>2.225700000000000e+115</test> | <test>22257e111</test>                    |
+-------------------------------------+-------------------------------------------+

次の例は、関数の引数を名前で指定する方法を示しています。

SELECT PARSE_XML(STR => '<test>22257e111</test>', DISABLE_AUTO_CONVERT => TRUE);
Copy
+--------------------------------------------------------------------------+
| PARSE_XML(STR => '<TEST>22257E111</TEST>', DISABLE_AUTO_CONVERT => TRUE) |
|--------------------------------------------------------------------------|
| <test>22257e111</test>                                                   |
+--------------------------------------------------------------------------+