如何在 SAP HANA 中通过 SQL 提取 XML 值?

How to extract XML value via SQL in SAP HANA?

我在 SAP HANA 中有数据库 table,其中一列存储 XML 字符串。我只需要一个存储在名为 <PROPERTY NAME="NAME"></PROPERTY> 的标签中的值。有几个标签具有该名称。我需要最上面的那个。 XML 看起来像这样:

<?xml version="1.0"?>
<LINK_PROCESS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" LINK_TYPE="LINK">
    <PROPERTY NAME="NAME">Import XY Data</PROPERTY>
    <PROPERTY NAME="DESCRIPTION">Import XY Data from File</PROPERTY>
    <PROPERTY NAME="ID">DKV8Y051VOKNVE7MRRYE4AXYK</PROPERTY>
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE">
        <PROPERTY NAME="NAME">Import XY</PROPERTY>
        <PROPERTY NAME="DESCRIPTION">Import XY Data</PROPERTY>
        <PROPERTY NAME="ID">04F3E61B5612439397CE76E3EC271598</PROPERTY>
    </LINK_PROCESS>
    <LINK_PROCESS LINK_TYPE="BPC_LINK">
        <PROPERTY NAME="NAME">XYZ</PROPERTY>
        <PROPERTY NAME="DESCRIPTION">XYZ Data</PROPERTY>
        <PROPERTY NAME="ID">7319D3A0196D4510924D32988B189A8E</PROPERTY>
    </LINK_PROCESS>
</LINK_PROCESS>

我想获取值 导入 XY 数据,仅此而已。我如何通过 SAP HANA SQL 提取它只是提取标签之间的值而不是整个 XML 字符串?

SAP HANA 1 (SPS12) 不提供直接使用 XML expressions/documents 的方法。正如@mjturner 已经提到的,HANA 2 通过提供 XML 处理内置函数改善了这种情况。

这意味着您必须想出自己的处理方式 XML 才能获得您感兴趣的值。 编写一个合适的 XML 解析器可能超出了任何人在 SQLScript 中想要做的事情,所以我建议不要尝试 that

相反,可以选择查找 NAME 标签中跟在 LINK_PROCESS type LINK 标签之后的字符串:

<LINK_PROCESS  ... LINK_TYPE="LINK">
<PROPERTY NAME="NAME">Import XY Data</PROPERTY>
                      ^^^^^^^^^^^^^^

可以通过正则表达式查找此结构,SAP HANA SPS12 支持 SUBSTRING_REGEXPR() (reference documentation) 函数。

请参阅 https://regex101.com/r/k5FVqU/1 以获取与结构匹配的示例正则表达式。

将其放入 HANA SQL 可能如下所示:

with data as (

    SELECT '<?xml version="1.0"?>
    <LINK_PROCESS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" LINK_TYPE="LINK">
    <PROPERTY NAME="NAME">Import XY Data</PROPERTY>
    <PROPERTY NAME="DESCRIPTION">Import XY Data from File</PROPERTY>
    <PROPERTY NAME="ID">DKV8Y051VOKNVE7MRRYE4AXYK</PROPERTY>
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE">
        <PROPERTY NAME="NAME">Import XY</PROPERTY>
        <PROPERTY NAME="DESCRIPTION">Import XY Data</PROPERTY>
        <PROPERTY NAME="ID">04F3E61B5612439397CE76E3EC271598</PROPERTY>
    </LINK_PROCESS>
    <LINK_PROCESS LINK_TYPE="BPC_LINK">
        <PROPERTY NAME="NAME">XYZ</PROPERTY>
        <PROPERTY NAME="DESCRIPTION">XYZ Data</PROPERTY>
        <PROPERTY NAME="ID">7319D3A0196D4510924D32988B189A8E</PROPERTY>
    </LINK_PROCESS>
</LINK_PROCESS>' as XML_DATA FROM DUMMY
)

SELECT 
    SUBSTR_REGEXPR('(<LINK_PROCESS.*LINK_TYPE="LINK">)\s*(<PROPERTY.*NAME="NAME">)(.*)(<\/PROPERTY>)'
                   FLAG 'in' 
                   IN "XML_DATA" 
                   GROUP 3 )
from data;

Import XY Data