我们在表中包含一个包含xml的列,并将其设置为基于非模式的xml列
数据可以包含节点的多个实例,如下所示:
<eq:Fund>
<v:FundCode>
<v:type>SEDOL</v:type>
<v:value>3049141</v:value>
</v:FundCode>
</eq:Fund>
<eq:Fund>
<v:FundCode>
<v:type>Product Provider Specific</v:type>
<v:value>CASH</v:value>
</v:FundCode>
</eq:Fund>
此查询返回448行:
WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3')
select * from xml_request
WHERE xml_request_body.value('contains( string( (//v:type)[1] ),"SEDOL")','bit') = 1
此查询返回784行(在删除结果列中的空格后)
WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3')
select xml_request.xml_request_ser, xml_request.agency_number, xml_request.policy_holder, xml_request.product,
xml_request_body.query('for $x in /eq:EQuote/eq:Request/eq:Fund where $x/v:FundCode/v:type = "SEDOL" return $x') as result
from xml_request
1)为什么它们会返回不同的行数?第一个查询找不到元素包含SEDOL的所有行?为什么不呢?
我猜这可能是因为带有SEDOL的元素可能不是第一个? 2)如何更改第一个查询以查看所有元素而不仅仅是第一个?
答案 0 :(得分:1)
第一个中的[1]
表示它明确要求第一个 type
元素(按文档顺序)包含SEDOL
,以便匹配被制造。所以,是的,如果你说某些行首先有非SEDOL FundCode
,那么它们将不匹配。
你想要做的第一种方式是
WHERE xml_request_body.exist('//v:type[contains(., "SEDOL")]') = 1
这会查找任何 v:type
元素,使文本包含SEDOL。