SQL 在 DB2 上查询。包含 XML 列上的函数
SQL Query on DB2. contains function on XML column
我的test
table有两列,一列是message_xml
类型XML
,另一列是company_names
类型VARCHAR
。我想在每个 XML 行中搜索一个词,如果 XML 有它然后导出 XML.
这里有 2 个样本 xml 存储在 DB2 中:
<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>.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>.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>.95</price>
<description>Light Belgian waffles </description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>.50</price>
<description>Thick slices of bread</description>
<calories>600</calories>
</food>
</breakfast_menu>
在这些 XML 文档中,我想找到单词 "bacon"(它可以在 XML 中的任何位置),然后将 XML 导出到文本文件.
我尝试通过首先将 XML 转换为字符串来使用 CONTAINS
,但我收到关于 VARCHAR
.
的错误
xmlcast(test.message_xml as varchar(255)) as export_XML
是我写的把XML转成string
的代码
[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
接下来我直接尝试使用 CONTAINS
但我收到有关未找到文本索引的错误。所以,我试图创建一个索引,但我也在那里遇到错误,错误显示为
"An unexpected token "idx1" was found following "L) as ( create
index". Expected tokens may include: "JOIN""
代码:
在 test(message_xml) 上创建索引 idx1
使用 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 列创建索引。如有不妥请指正
您应该利用 DB2 的 PureXML
特性。例如,以下 WHERE
子句将在元素 name 或 description[=18= 中的任何位置搜索 bacon ].
WHERE XMLEXISTS('/breakfast_menu/food[contains(name,"bacon") or contains(description,"bacon")] ' PASSING message_xml)
由于 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
我不知道这个错误是什么。
我的test
table有两列,一列是message_xml
类型XML
,另一列是company_names
类型VARCHAR
。我想在每个 XML 行中搜索一个词,如果 XML 有它然后导出 XML.
这里有 2 个样本 xml 存储在 DB2 中:
<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>.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>.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>.95</price>
<description>Light Belgian waffles </description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>.50</price>
<description>Thick slices of bread</description>
<calories>600</calories>
</food>
</breakfast_menu>
在这些 XML 文档中,我想找到单词 "bacon"(它可以在 XML 中的任何位置),然后将 XML 导出到文本文件.
我尝试通过首先将 XML 转换为字符串来使用 CONTAINS
,但我收到关于 VARCHAR
.
xmlcast(test.message_xml as varchar(255)) as export_XML
是我写的把XML转成string
[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
接下来我直接尝试使用 CONTAINS
但我收到有关未找到文本索引的错误。所以,我试图创建一个索引,但我也在那里遇到错误,错误显示为
"An unexpected token "idx1" was found following "L) as ( create index". Expected tokens may include: "JOIN""
代码: 在 test(message_xml) 上创建索引 idx1 使用 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 列创建索引。如有不妥请指正
您应该利用 DB2 的 PureXML
特性。例如,以下 WHERE
子句将在元素 name 或 description[=18= 中的任何位置搜索 bacon ].
WHERE XMLEXISTS('/breakfast_menu/food[contains(name,"bacon") or contains(description,"bacon")] ' PASSING message_xml)
由于 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
我不知道这个错误是什么。