【问题标题】:xml query with more than one condition具有多个条件的 xml 查询
【发布时间】:2018-10-14 08:20:58
【问题描述】:

这是我的 sql 数据:

<ArrayOfFlowDetailParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FlowDetailParameters>
    <DepartmentId>23</DepartmentId>
    <UserId xsi:nil="true" />
    <Username />
    <FullName />
    <ConfirmDateTime xsi:nil="true" />
    <Comment />
    <Status>Pending</Status>
    <AttachmentId />
  </FlowDetailParameters>
  <FlowDetailParameters>
    <DepartmentId>22</DepartmentId>
    <UserId xsi:nil="true" />
    <Username />
    <FullName />
    <ConfirmDateTime xsi:nil="true" />
    <Comment />
    <Status>Pending</Status>
    <AttachmentId />
  </FlowDetailParameters>
  <FlowDetailParameters>
    <DepartmentId>7</DepartmentId>
    <UserId xsi:nil="true" />
    <Username />
    <FullName />
    <ConfirmDateTime xsi:nil="true" />
    <Comment />
    <Status>Pending</Status>
    <AttachmentId />
  </FlowDetailParameters>
  <FlowDetailParameters>
    <DepartmentId>18</DepartmentId>
    <UserId xsi:nil="true" />
    <Username />
    <FullName />
    <ConfirmDateTime xsi:nil="true" />
    <Comment />
    <Status>Pending</Status>
    <AttachmentId />
  </FlowDetailParameters>
</ArrayOfFlowDetailParameters>

我想找到一个节点,我的意思是 FlowDetailParameters 有 2 个条件,这意味着 departmentid=23 and status=pending 。

这是我的查询:

SELECT
    Requests.* 
FROM
    Requests
WHERE
    (@organizationid IS NULL OR OrganizationId = @organizationid) 
    AND (@DetailStatus IS NULL 
         OR (EXISTS (SELECT *
                     FROM Requests.FlowDetailParameter.nodes('/ArrayOfFlowDetailParameters/FlowDetailParameters/DepartmentId') as Parms(DepartmentId)
                     WHERE DepartmentId.value('.', 'bigint') = @departmentId) 
         AND EXISTS (SELECT *
                     FROM Requests.FlowDetailParameter.nodes('/ArrayOfFlowDetailParameters/FlowDetailParameters/Status') as Parms(Status)
                     WHERE Status.value('.', 'nvarchar(max)') = @DetailStatus)))

但是我的查询找到了带有departmentid=23 or status=pending的节点

【问题讨论】:

    标签: sql-server xml sqlxml


    【解决方案1】:

    您可以直接在 XQuery 中将搜索条件应用于子节点:

    declare @t table (XData xml);
    
    declare @StatusValue varchar(50) = 'Pending',
        @DepartmentId int = 23;
    
    insert into @t (XData)
    values (
    N'<ArrayOfFlowDetailParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <FlowDetailParameters>
        <DepartmentId>23</DepartmentId>
        <UserId  />
        <Username />
        <FullName />
        <ConfirmDateTime  />
        <Comment />
        <Status>Pending</Status>
        <AttachmentId />
      </FlowDetailParameters>
      <FlowDetailParameters>
        <DepartmentId>22</DepartmentId>
        <UserId  />
        <Username />
        <FullName />
        <ConfirmDateTime  />
        <Comment />
        <Status>Pending</Status>
        <AttachmentId />
      </FlowDetailParameters>
      <FlowDetailParameters>
        <DepartmentId>7</DepartmentId>
        <UserId  />
        <Username />
        <FullName />
        <ConfirmDateTime  />
        <Comment />
        <Status>Pending</Status>
        <AttachmentId />
      </FlowDetailParameters>
      <FlowDetailParameters>
        <DepartmentId>18</DepartmentId>
        <UserId  />
        <Username />
        <FullName />
        <ConfirmDateTime  />
        <Comment />
        <Status>Pending</Status>
        <AttachmentId />
      </FlowDetailParameters>
    </ArrayOfFlowDetailParameters>');
    
    select a.c.query('.')
    from @t t
        cross apply t.XData.nodes('/ArrayOfFlowDetailParameters/FlowDetailParameters[
            ./DepartmentId[1]/text() = sql:variable("@DepartmentId")
            and ./Status[1]/text() = sql:variable("@StatusValue")
        ]') a(c);
    

    另外,由于您可能需要这个,我还提供了一个如何参数化此类查询的示例。

    【讨论】:

      【解决方案2】:

      如果您想提取应用您的条件的值和相关 XML 部分,您可以尝试使用:

      DECLARE @table table (XmlCol xml )
      insert into @table
      values 
      ('<ArrayOfFlowDetailParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <FlowDetailParameters>
          <DepartmentId>23</DepartmentId>
          <UserId xsi:nil="true" />
          <Username />
          <FullName />
          <ConfirmDateTime xsi:nil="true" />
          <Comment />
          <Status>Pending</Status>
          <AttachmentId />
        </FlowDetailParameters>
        <FlowDetailParameters>
          <DepartmentId>22</DepartmentId>
          <UserId xsi:nil="true" />
          <Username />
          <FullName />
          <ConfirmDateTime xsi:nil="true" />
          <Comment />
          <Status>Pending</Status>
          <AttachmentId />
        </FlowDetailParameters>
        <FlowDetailParameters>
          <DepartmentId>7</DepartmentId>
          <UserId xsi:nil="true" />
          <Username />
          <FullName />
          <ConfirmDateTime xsi:nil="true" />
          <Comment />
          <Status>Pending</Status>
          <AttachmentId />
        </FlowDetailParameters>
        <FlowDetailParameters>
          <DepartmentId>18</DepartmentId>
          <UserId xsi:nil="true" />
          <Username />
          <FullName />
          <ConfirmDateTime xsi:nil="true" />
          <Comment />
          <Status>Pending</Status>
          <AttachmentId />
        </FlowDetailParameters>
      </ArrayOfFlowDetailParameters>')
      
      ;
      WITH XmlBreak as 
      (
      SELECT x.v.query('.') TheXml,
             x.v.value('(DepartmentId/text())[1]', 'int') DepartmentId,
             x.v.value('(Status/text())[1]', 'varchar(50)') Status    
       FROM @table t
          CROSS APPLY XmlCol.nodes ('/ArrayOfFlowDetailParameters/FlowDetailParameters') x(v)
      )
      SELECT * 
      FROM XmlBreak
      WHERE DepartmentId = 23 and Status = 'Pending'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2021-07-26
        • 2021-12-29
        • 2017-03-16
        相关资源
        最近更新 更多