我不明白为什么extractvalue在使用mysql concat函数时不返回属性值。
SET @xml = '<items>
<docHeader companyIdIssuer="company" docTypeId="2" companyIdReceiver="nin" dateIssue="2018-12-28">
<attribute attributeId="2" value="1236"/>
<docDetail productId="1" valor="some value">
<variable variableId="6" value="12.3" unitId="34"/>
<variable variableId="7" value="2.3" unitId="34"/>
<variable variableId="3" value="4.325" unitId="34"/>
<variable variableId="5" value="20" unitId="106"/>
<attribute attributeId="1" value="1236"/>
</docDetail>
</docHeader>
</items>';
SET @headerAttributePath = '//items/docHeader[1]/attribute[1]';
SET @detailPath = '//items/docHeader[1]/docDetail[1]';
SET @detailAttributePath = '//items/docHeader[1]/docDetail[1]/attribute[1]';
select extractValue(@xml, concat(@headerAttributePath, '/@attributeId')) AS attIdConcat,
extractValue(@xml, '//items/docHeader[1]/attribute[1]/@attributeId') AS attIdPlain,
extractValue(@xml, concat(@headerAttributePath, '/@value')) AS attValueConcat,
extractValue(@xml, '//items/docHeader[1]/attribute[1]/@value') AS attValuePlain,
@headerAttributePath AS attHeaderPath,
concat(@headerAttributePath, '/@value') AS attValuePathConcat,
'//items/docHeader[1]/attribute[1]/@value' AS attValuePathPlain,
STRCMP(concat(@headerAttributePath, '/@value'), '//items/docHeader[1]/attribute[1]/@value') AS pathStrComp,
extractValue(@xml, concat(@detailPath, '/@valor')) AS detValueConcat,
extractValue(@xml, concat(@detailAttributePath, '/@attributeId')) AS attDetIdConcat,
extractValue(@xml, concat(@detailAttributePath, '/@value')) AS attDetValueConcat;
示例:sql fiddle
1条答案
按热度按时间bvjxkvbb1#
一个相当奇怪的情况,似乎有些路径的组合,例如,
items -> docHeader -> attribute -> @value
或者items -> docHeader -> docDetail -> @valor
,在解析时产生错误,这是一个错误。一些解决方法:
如果不能更改任何元素的名称,可以在concat函数中使用cast()函数。
重命名其中一个元素,例如,
docHeader
至doc_Header
,attribute
至attr
或者valor
至_valor
.见db小提琴。
正如@barmar所提到的,在mysql 8.0中,一切都按预期工作,请参见db fiddle。
更新
经过一些额外的测试,我们可以看到当路径的总长度没有达到某个字符长度时也会出现问题,请参阅db fiddle。