【问题标题】:Query on XML column with space condition查询带有空格条件的 XML 列
【发布时间】:2021-12-18 08:11:24
【问题描述】:

我有一个表格,其中一列是 XML 列。

表 1:

Column1   Column2
1         XML value 

这里我需要找到它有前导空格的属性值,例如。

这是XML列[上表中的Column2],这里BankAccountNumber标签有前导空格,所以我需要编写一个查询来查找表中所有有前导空格的记录,请帮忙我。

<PaymentMethodDetails>
    <EFtDetails>
        <routingNumber>5575776567</routingNumber>
        <BankAccountNumber>1234 </BankAccountNumber>
    </EFtDetails>
</PaymentMethodDetails>

【问题讨论】:

  • 看起来像是尾随空格,而不是前导空格,请澄清。您是只检查BankAccountNumber 还是所有节点?如果是这样,您希望将所有 XML 节点分解为单独的行,还是希望将整个 XML 作为一个值?
  • 感谢您的回复,我需要检查上面提到的 BankaccountNumber 标签中 Numbers 末尾有空格的所有记录。在 1234 结束时,我们有空间

标签: c# sql .net sql-server


【解决方案1】:

很遗憾,SQL Server 不支持starts-withends-with 函数。但是我们可以通过substring 解决这个问题

substring(., 1, 1) = " "

要查找尾随空格而不是前导空格,请改用

substring(., string-length(.), 1) = " "

要查找任何以空格开头的BankAccountNumber 节点,您可以使用exist

SELECT *
FROM Table1 t1
WHERE t1.Column2.exist('
  /PaymentMethodDetails/EFtDetails/BankAccountNumber/text()[substring(., string-length(.), 1) = " "]
') = 1;

要查找以空格开头的任何个节点,您可以使用// 包含所有后代节点

SELECT *
FROM Table1 t1
WHERE t1.Column2.exist('
  //*[text()[substring(., string-length(.), 1) = " "]]
') = 1;

要将匹配的节点实际分解为单独的值,您可以使用.nodes.value 的组合

SELECT
  x.nod.value('local-name(.)[1]','nvarchar(max)'),
  x.nod.value('text()[1]','nvarchar(max)')
FROM Table1 t1
CROSS APPLY t1.Column2.nodes('
  //*[text()[substring(., string-length(.), 1) = " "]]
') x(nod);

db<>fiddle

【讨论】:

  • 非常感谢您的回复和您的时间,实际上我需要在我的示例中找到数字末尾的空格,就像我们在 1234 末尾有空格一样
  • 所以你使用substring(., string-length(.), 1) = " ",如图所示
  • 感谢您的回复
猜你喜欢
  • 2012-12-04
  • 2011-08-13
  • 2019-04-27
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多