问题描述
是否可以在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 |
+------+