SQL Server XQuery路径中的备用节点?

问题描述

是否可以在sql Server的XQuery路径中像正则表达式中那样具有某种“替代组”?

我有这个查询...

SELECT Q.ROWID QUEUEID,Q.DOCUMENTPACKAGETYPE,B.R.value('@_ID','NAME') PARTYID,B.R.value('@_BorrowerID','NAME') BORROWERID,B.R.value('@_Name','NAME') NAME,B.R.value('@_EmailAddress','NAME') EMAILADDRESS
FROM docutech.QUEUE_EX Q 
CROSS APPLY Q.DATA.nodes('LOAN_PUSHBACK_PACKAGE/EVENT_DATA/ESIGN/PARTY') AS B(R)
WHERE Q.REASONFORPUSHBACK = 'Documentdistribution' AND B.R.value('@_Type','NAME') = 'Borrower'

但是我需要的是,对于CROSS APPLY,路径中的ESIGN节点实际上可以是ESIGN或ECLOSE。因此,我正在寻求执行以下操作(以RegEx术语考虑)...

CROSS APPLY Q.DATA.nodes('LOAN_PUSHBACK_PACKAGE/EVENT_DATA/(ESIGN)|(ECLOSE)/PARTY') AS B(R)

有什么办法可以做这样的事情吗?我真的很讨厌不得不重复两次相同的查询,只是为了简单的区别,尽管XQuery不支持这样的选项?

实际上,我只是发现我可以使用一个星号,这两个星号都可以匹配,但是我希望能够将其限制为那些已知的节点值。如果没有,我想那会做到的。

解决方法

我想我能满足您的需求。这是给您的概念示例。

XPath谓词表达式正在检查特定级别的元素名称是否属于指定名称的序列。 <SomethingElse>元素不是序列的成员,这就是为什么不检索其数据的原因。

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<LOAN_PUSHBACK_PACKAGE>
    <EVENT_DATA>
        <ESIGN>
            <PARTY _Name="one"/>
        </ESIGN>
        <ECLOSE>
            <PARTY _Name="two"/>
        </ECLOSE>
        <SomethingElse>
            <PARTY _Name="three"/>
        </SomethingElse>
    </EVENT_DATA>
</LOAN_PUSHBACK_PACKAGE>');
-- DDL and sample data population,end

SELECT c.value('@_Name','VARCHAR(20)') AS [Name] 
FROM @tbl
    CROSS APPLY xmldata.nodes('/LOAN_PUSHBACK_PACKAGE/EVENT_DATA/*[local-name(.)=("ESIGN","ECLOSE")]/PARTY') AS t(c);

输出

+------+
| Name |
+------+
| one  |
| two  |
+------+