2016-05-25 52 views
0

私のtestテーブルは2つの列を持ち、1つはXMLmessage_xmlであり、もう1つはVARCHARcompany_namesです。各XML行で単語を検索したい場合は、XMLがあればそのXMLをエクスポートします。DB2上のSQLクエリ。 XML列の関数を含む

はここ2つのDB2に格納されたXMLのサンプルです:私は言葉「ベーコン」を検索するこれらのXML文書で

<breakfast_menu> 
    <food> 
    <name>Belgian Waffles</name> 
    <price>$5.95</price> 
    <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description> 
    <calories>650</calories> 
    </food> 
    <food> 
    <name>Homestyle Breakfast</name> 
    <price>$6.95</price> 
    <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description> 
    <calories>950</calories> 
    </food> 
</breakfast_menu> 

<breakfast_menu> 
    <food> 
    <name>Strawberry Belgian Waffles</name> 
    <price>$7.95</price> 
    <description>Light Belgian waffles </description> 
    <calories>900</calories> 
    </food> 
    <food> 
    <name>French Toast</name> 
    <price>$4.50</price> 
    <description>Thick slices of bread</description> 
    <calories>600</calories> 
    </food> 
</breakfast_menu> 

(それはどこにでもXMLで可能)だけにそのXMLをエクスポートテキストファイル。

最初にXMLを文字列に変換して、CONTAINSを使ってみましたが、VARCHARに関するエラーが発生しました。

xmlcast(test.message_xml as varchar(255)) as export_XML

は、私が直接 CONTAINSを使用しようとした私は、文字列

[Error Code: -16061, SQL State: 10608] The value "429541527005540133404021548131000109999-12-312..." cannot be constructed as, or cast (using an implicit or explicit cast) to the data type "VARCHAR_255". Error QName=err:FORG0001.. SQLCODE=-16061, SQLSTATE=10608, DRIVER=4.15.82

次へXMLを変換するために書いたコードですが、私は発見されたテキスト索引に関するないエラーが発生します。だから、私は、インデックスを作成しようとしましたが、私はあまりにもそこにエラーを取得し、エラーがコードの

"An unexpected token "idx1" was found following "L) as (create index". Expected tokens may include: "JOIN""

を読み取ります テストにインデックスIDX1を作成する(message_xml) としてXMLPATTERN「/ XML」 を使用してキーを生成しますVARCHAR(9999)

私のコードは次のとおりです。

:上記のコードで

@export on; 
@export set filename="D:\temp\searchResults.txt"; 
@set maxrows 10; 
with Tempresult(export_xml) 
as 
(
create index idx1 on test(message_xml) 
generate key using xmlpattern '/XML' 
as varchar(9999) 
select 
    test.message_xml as export_XML 
from test where source_id = 14 
and trans_timestamp between '2015-10-01' and '2016-04-30' 
) 
select 
    export_XML 
    from Tempresult 
    //where LOCATE('bacon',export_XML) > 0; 
    where CONTAINS(export_XML, ' "bacon" ') = 1; 
@export off; 

インデックスを作成することなく、私はこのエラーを取得します

[Error Code: -443, SQL State: 38799] Routine "*RCH_8K64" (specific name "") has returned an error SQLSTATE with diagnostic text "CTE0199 No text index corresponding to column "MESSAGE_XML"".. SQLCODE=-443, SQLSTATE=38799, DRIVER=4.15.82

私はさらに、LOCATE,CONVERT,CASTを使用しようとしましたが、使用しませんでした。誰かがこれを解決するのに私を助けてくれる?

解決策はXMLを文字列に変換してCONTAINSまたはLOCATEを適用するか、xml列のインデックスを作成することが考えられます。私が間違っていれば私を修正してください。

+0

私はxmlを文字列に変換するために使用しました: "xmlcast(test.message_xml as varchar(9999)as export_XML")。 私が検索している単語のxml全体をエクスポートしたいので、varcharで大きな数値を使用しました。 – user3814614

+0

問題を解決しようとする試みを示す代わりに、問題自体をよりよく説明するべきでしょう。テーブル定義、サンプルデータ、および希望の結果を表示します。 「VARCHARに関するエラー」と言っているのではなく、実際のエラーコードを記入してメッセージを記入してください。私はそれに簡単な解決策があるかもしれないと思う。ところで、XML索引は、テキスト索引とは異なります。これは、「CONTAINS」機能が動作するために必要です。 – mustaccio

+0

私が試した解決策が得られるかと心配しているので、私は試行を挙げました。もし私がエラーを列挙すれば、誰かが私に訂正を提案することができます。私はあなたが要求した詳細を提供しなかったことに同意します、そして、私はそれを残念です。私はそれを提供します。あなたはテキストインデックスの作成に私を助けてくれますか? – user3814614

答えて

0

XMLSERIALIZE(私は思う)のために実行時間を犠牲にして解決策が見つかりました。

select message_xml AS export_xml from test where LOCATE('bacon',XMLSERIALIZE(xmlquery('$clam//breakfast_menu ' passing test.message_xml as "clam") as CLOB)) > 0

は今のところ、これは私のために働きました。場合によっては、次のようなエラーが表示されることがあります。

[Error Code: -433, SQL State: 22001] Value "et">0.00" is too long.. SQLCODE=-433, SQLSTATE=22001, DRIVER=4.15.82

このエラーの原因を特定できませんでした。

1

DB2のPureXMLの機能を利用する必要があります。たとえば、次のWHERE句は、要素またはの説明のどこにでもベーコンを検索します。

WHERE XMLEXISTS('/breakfast_menu/food[contains(name,"bacon") or contains(description,"bacon")] ' PASSING message_xml) 
+0

素晴らしいです。返信Stavr00をありがとう。 「ベーコン」がタグの名前属性である場合はどうでしょうか?このように: ' 1'。どのようにWHERE句を編集できますか? 私はテキスト検索としてできる方法はありますか?時には私は本当に本当に巨大なXMLに対処する必要があります。 – user3814614

+0

...これは「XPATH」の質問になります;) – Stavr00

+0

ああ、それを得ました。私はあなたの提案を試み、あなたに戻ってきます。 ありがとうございます。 その間、テキスト検索を使用する方法を提案できますか?それをやろうとすると、列にテキストインデックスが表示されません。 – user3814614

関連する問題