私のtest
テーブルは2つの列を持ち、1つはXML
のmessage_xml
であり、もう1つはVARCHAR
のcompany_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列のインデックスを作成することが考えられます。私が間違っていれば私を修正してください。
私はxmlを文字列に変換するために使用しました: "xmlcast(test.message_xml as varchar(9999)as export_XML")。 私が検索している単語のxml全体をエクスポートしたいので、varcharで大きな数値を使用しました。 – user3814614
問題を解決しようとする試みを示す代わりに、問題自体をよりよく説明するべきでしょう。テーブル定義、サンプルデータ、および希望の結果を表示します。 「VARCHARに関するエラー」と言っているのではなく、実際のエラーコードを記入してメッセージを記入してください。私はそれに簡単な解決策があるかもしれないと思う。ところで、XML索引は、テキスト索引とは異なります。これは、「CONTAINS」機能が動作するために必要です。 – mustaccio
私が試した解決策が得られるかと心配しているので、私は試行を挙げました。もし私がエラーを列挙すれば、誰かが私に訂正を提案することができます。私はあなたが要求した詳細を提供しなかったことに同意します、そして、私はそれを残念です。私はそれを提供します。あなたはテキストインデックスの作成に私を助けてくれますか? – user3814614