XMLEXISTS 演算子

XMLEXISTSは、SQLにてXMLを問い合わせるときに利用できるSQL/XML演算子です。

XMLEXISTS演算子は二つの引数を取ります。XML問合せ式とDerbyXML値です。

構文

XMLEXISTS ( xquery文字列リテラル
    PASSING BY REF XML値式 [ BY REF ] )
xquery文字列リテラル
文字列のリテラルとして与えられる必要があります。もし引数がパラメータであったり、リテラルでない式であったり、文字列でない(整数のような)リテラルであった場合、Derbyはエラーを挙げます。 xquery文字列リテラルはApache XalanがサポートしているXPath式でなければなりません。Derbyは、XML問合せ式を評価するとき常にApache Xalanを使います。XalanはXQueryを完全にサポートしないので、Derbyもその制約を受けます。 もしXalanが引数に与えられた問合せをコンパイルして実行できなかった場合、Xalanが挙げた例外をDerbyは補足してSQLExceptionとして投げなおします。 XPathおよびXQuery式の詳細については、次のウェブサイトを参照してください。http://www.w3.org/TR/xpathおよび、http://www.w3.org/TR/xquery/
XML値式
XMLのデータ値かつ整形式のSQL/XML文書でなければなりません。 XML値式はパラメータであってはなりません。 Derbyは暗黙の構文解析やXML値の型変換を行いません。従って、文字列やその他のデータタイプを使うとエラーが発生します。 もし引数がDerby XMLQUERY演算子によって返された並びであった場合、 その並びが、一つの文書ノードであるノードの並びであった場合にのみ、その引数は許されます。 そうではなければ、Derbyはエラーを挙げます。
BY REF
省略可能なこのキーワードにて、Derbyにて利用可能な引数渡しの方法が記述されます。 BY REFは既定の引数渡しの方法なので、XMLEXISTS演算子はこのキーワードの有無にかかわらず同様に振舞います。引数渡しの方法の詳細については、SQL/XML仕様を参照してください。

演算子の結果と他の演算子との組み合わせ

XMLEXISTS演算子の結果は、xquery文字列リテラルXML値式に対して評価した結果に基づく、SQL真偽値です。 XMLEXISTS演算子が返す値は、
UNKNOWN
XML値式がnullであった場合です。
TRUE
問合せの式をxmlの値に対して評価して、空ではないノードや値の並びが返った場合です。
FALSE
問合せの式をxmlの値に対して評価して、空の並びが返った場合です。

XMLEXISTS演算子は問合せが評価された結果を直接に返しません。問合せが評価された結果を直接に得たい場合、XMLQUERY演算子を使う必要があります。

XMLEXISTS演算子の結果はSQLの真偽値なので、真偽型の関数を置くことができる場所なら何処でもXMLEXISTS演算子を使うことができます。たとえば、XMLEXISTS演算子を表定義のチェック制約に使うことや、WHERE節の述部に置くこともできます。

x_table表にて、各行のxcolというXMLの列に、age属性が20のstudentという要素があるかを知るには次のように書きます。
SELECT id, XMLEXISTS('//student[@age=20]' PASSING BY REF xcol) 
    FROM x_table
x_table表から、xcolというXMLの列がnullでなく、その列の値に/roster/studentという要素を持つ、各行のIDを返すにはこの文を書きます。
SELECT id FROM x_table WHERE XMLEXISTS('/roster/student' PASSING BY REF xcol)
x_tableという表にて、xcolというXMLの列に挿入できるXMLの値を制限することもできます。この例では、age属性が25より小さいstudent要素を、少なくとも一つ持たなければならない、という制約を設けます。 表を作るにはこのように書きます。
CREATE TABLE x_table ( id INT, xcol XML CHECK (XMLEXISTS ('//student[@age < 25]' PASSING BY REF xcol)) )

使い方の覚書

DerbyにてXMLの機能を使う場合、Apache XercesのようなJAXP parserとApache XalanがJavaのクラスパスに記述されている必要があります。 JAXP parserあるいはXalanがクラスパスに記述されていなかった場合、XMLEXISTS演算子を利用するとエラーになります。