【问题标题】:XPATH query in SQL Server for an XML type columnSQL Server 中针对 XML 类型列的 XPATH 查询
【发布时间】:2018-09-07 13:48:03
【问题描述】:

我有一个表'TEST',它有一个xml类型的列'info'。 列信息具有 XML 之类的

<RootEPS xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <EPS key="FirstName" value="Test" />
   <EPS key="LastName" value="Singh" />
   <EPS key="address1" value="23 t-2" />
   <EPS key="EmailAddress" value="test.singh@gmail.com" />  
</RootEPS>

我想创建一个 XPATH sql 查询来获取每个 EPS 节点的属性“值”的数据,例如根据给定的电子邮件,firstName 作为 fName,lastName 作为 lName。

对于输入电子邮件 test.singh@gmail.com,我想要一个类似的输出

fName  |  lName  | address1  |  email
Test   |  Singh  | 23 t-2    | test.singh@gmail.com

我正在尝试这样的事情,但它不起作用

SELECT distinct
  N.x.value('@value', 'nvarchar(100)') as fName,
  N.x.value('@value', 'nvarchar(100)') as lName,
  N.x.value('@value', 'nvarchar(100)') as address1,
  N.x.value('@value', 'nvarchar(100)') as email,
FROM
  TEST AS RO
   CROSS APPLY
   RO.info.nodes('/RootEPS/EPS[@key="EmailAddress" and @value="test.singh@gmail.com"]') AS N(x)

在输出中我只得到电子邮件值。主要是在 N.x.value('@value' 部分有问题。

【问题讨论】:

    标签: sql database xpath


    【解决方案1】:

    您正在选择单个 EPS 节点。在整个RootEPS 节点上使用values,您可以查询其所有EPS 子节点:

    SELECT  info.value('(RootEPS/EPS[@key="FirstName"]/@value)[1]', 'nvarchar(100)') as fName
    ,       info.value('(RootEPS/EPS[@key="LastName"]/@value)[1]', 'nvarchar(100)') as lName
    ,       info.value('(RootEPS/EPS[@key="address1"]/@value)[1]', 'nvarchar(100)') as address1
    ,       info.value('(RootEPS/EPS[@key="EmailAddress"]/@value)[1]', 'nvarchar(100)') 
                as email
    FROM    TEST
    WHERE   info.value('(RootEPS/EPS[@key="EmailAddress"]/@value)[1]', 'nvarchar(100)')
                = 'test.singh@gmail.com'
    

    Working example at SE Data.

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多