ExtractValue(xml_frag, xpath_expr)

ExtractValue(xml_frag, xpath_expr)

ExtractValue() はふたつのストリング引数、XML マークアップのフラグメント xml_frag 、そして XPath 式 xpath_expr ( locator とも呼ばれる ) を取り、XPath 式によってマッチされたエレメントの子である、最初のテキスト ノードのテキスト ( CDATA ) を戻します。これは、/text() を付加した後に、xpath_expr を使用してマッチを行うのと同様です。つまり、ExtractValue('<a><b>Sakila</b></a>', '/a/b')ExtractValue('<a><b>Sakila</b></a>', '/a/b/text()') は同じ結果を生成します。

複数のマッチが検出される場合、各マッチング エレメントの、最初の子のテキスト ノードの内容は、単一の、スペースで区切られたストリングとして ( マッチした順で ) 戻されます。

( 拡大された ) 式 — に対して、マッチするテキスト ノードが検出されない場合 — どういう理由であれ、xpth_expr が有効で、xml_frag が適切に成型されていれば — 空のストリングが戻されます。空のエレメントでの整合と、整合するものがないのとは、区別はされません。これはデザインによるものです。

xml_frag でマッチするエレメントが見つからなかったのか、またはマッチするエレメントはあったものの、非子テキスト ノードを含んでいたのかを判断する必要があれば、XPath count() 関数を使用する式の結果をテストしてください。例えば、次のように、これらのステートメントの両方が空のストリングを返す場合 :

mysql> SELECT ExtractValue('<a><b/></a>', '/a/b');
+-------------------------------------+
| ExtractValue('>a<>b/<>/a<', '/a/b') |
+-------------------------------------+
|                                     |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ExtractValue('<a><c/></a>', '/a/b');
+-------------------------------------+
| ExtractValue('<a><c/></a>', '/a/b') |
+-------------------------------------+
|                                     |
+-------------------------------------+
1 row in set (0.00 sec)

しかし、次のように、実際にまっちするエレメントがあったのかを確認することはできます :

mysql> SELECT ExtractValue('<a><b/></a>', 'count(/a/b)');
+-------------------------------------+
| ExtractValue('<a><b/></a>', 'count(/a/b)') |
+-------------------------------------+
| 1                                   |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ExtractValue('<a><c/></a>', 'count(/a/b)');
+-------------------------------------+
| ExtractValue('<a><c/></a>', 'count(/a/b)') |
+-------------------------------------+
| 0                                   |
+-------------------------------------+
1 row in set (0.01 sec)

ExtractValue()CDATA のみを戻し、マッチング タグに含まれるタグや、それらのコンテントは戻されません ( 次の例の、val1 として戻された結果を参照 ) 。

mysql> SELECT
    ->   ExtractValue('<a>ccc<b>ddd</b></a>', '/a') AS val1,
    ->   ExtractValue('<a>ccc<b>ddd</b></a>', '/a/b') AS val2,
    ->   ExtractValue('<a>ccc<b>ddd</b></a>', '//b') AS val3,
    ->   ExtractValue('<a>ccc<b>ddd</b></a>', '/b') AS val4,
    ->   ExtractValue('<a>ccc<b>ddd</b><b>eee</b></a>', '//b') AS val5;

+------+------+------+------+---------+
| val1 | val2 | val3 | val4 | val5    |
+------+------+------+------+---------+
| ccc  | ddd  | ddd  |      | ddd eee |
+------+------+------+------+---------+

MySQL 5.1.8 からは、この関数は、contains() との比較に現行の SQL の照合を使用します。( 以前は、バイナリ — 大文字小文字の区別あり — 比較が常に使用されていました。)