【问题标题】:Alternate nodes in a SQL Server XQuery path?SQL Server XQuery 路径中的备用节点?
【发布时间】:2020-08-25 23:18:31
【问题描述】:

有什么方法可以在 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 可能不支持这样的选项?

实际上,我刚刚发现我可以使用星号,这将匹配两者,但如果可能的话,我希望能够将其限制为那些已知的节点值。如果没有,我想就可以了。

【问题讨论】:

  • 如果您能提供一个最小的可重现示例,那就太好了:(1) DDL 和样本数据填充,即 CREATE 表加上 INSERT、T-SQL 语句。 (2) 你需要做什么,即逻辑,以及你在 T-SQL 中尝试实现它。 (3) 基于上述#1 中的样本数据的期望输出。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql-server xml xquery


【解决方案1】:

我想我得到了你需要的东西。这是给您的概念示例。

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  |
+------+

【讨论】:

  • 做到了!而且,它从* 中删除了几行,暴露了我们从第 3 方数据源返回的其他记录类型。 (它们提供的文档很少!) ... XQuery 世界中提到的这种语法是什么?我曾尝试使用谷歌搜索 reg exoptionsalternatesoptional groups 和其他一些人,但无法弄清楚这一点。了解 XQuery 领域的正确名称可能有助于找出我可能提出的任何其他问题。
  • 嘿...通过将以下字段添加到我的 SELECT 字段列表中,想出了如何确定它匹配的内容:B.R.value('local-name(..)', 'NAME') PARENT,它返回 ESIGNECLOSE
  • @eidylon,很高兴听到建议的解决方案对您有用。 "...在 XQuery 世界中这个语法是什么?.." 它是 XQuery 用语中的一个序列。请在 LinkedIn 上与我联系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2011-07-26
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多