MySQL 5.6 ExtractValue XPath concat - PullRequest
       19

MySQL 5.6 ExtractValue XPath concat

0 голосов
/ 28 декабря 2018

Я не понимаю, почему 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 Ответ

0 голосов
/ 29 декабря 2018

Довольно специфический случай, кажется, что комбинация некоторых путей, например, items -> docHeader -> attribute -> @value или items -> docHeader -> docDetail -> @valor, приводит к ошибкам при разборе, что является ошибкой.

Некоторые обходные пути:

  • Если вы не можете изменить имя какого-либо из элементов, вы можете использовать функцию CAST () в функции CONCAT.
  • Переименовать один из элементов,например, docHeader до doc_Header, attribute до attr или valor до _valor.

См. db-fiddle .

Как уже упоминалось @Barmar, в MySQL 8.0 все работает как положено, см. db-fiddle .

ОБНОВЛЕНИЕ

После некоторых дополнительныхтестируя, мы видим, что проблема также возникает, когда общая длина пути не достигает определенной длины символа, см. db-fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...