如何在 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
我在 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