2012-08-16 57 views
1

我试图查询在其他...下面的查询XML列时,工作正常...如何从SQL Server中的XML列中选择如果列不是单

SELECT 
      OrderID, 
      AccountNumber, 
      ItemID, 
      substring(replace(lower(s.Street),' ',''),1,8) 
       + substring(replace(lower(s.City),' ',''),1,8) 
       + substring(replace(lower(s.State),' ',''),1,8) 
       + substring(replace(s.ZipCode,' ',''),1,5)AddressHash, 
      ShipName, 
      Street, 
      Street2 
      City, 
      State, 
      ZipCode, 
      OrderDate 
    FROM (SELECT UpwardOrderID, AccountNumber, UpwardLeagueID, 
        /* NOTE THAT THIS SYNTAX WORKS ONLY WORKS BECAUSE THE NODES ARE SINGLETONS. */ 
        x.value('(./ShipTo/Name)[1]', 'VARCHAR(255)')            AS ShipName, 
        x.value('(./ShipTo/Street1)[1]', 'VARCHAR(255)')            AS Street, 
        x.value('(./ShipTo/Street2)[1]', 'VARCHAR(255)')            AS Street2, 
        x.value('(./ShipTo/Subdivision1)[1]', 'VARCHAR(255)')          AS City, 
        x.value('(./ShipTo/Subdivision2)[1]', 'VARCHAR(255)')          AS State, 
        x.value('(./ShipTo/PostalCode)[1]', 'VARCHAR(255)')           AS ZipCode, 
        x.value('(./Order/ClientOrderDate)[1]', 'DATETIME')           AS OrderDate 
        --x.value('(./ShippingMethods/ShippingMethod/ID)[../Selected/text()=1]','VARCHAR(255)') 
      FROM av_order CROSS APPLY orderXML.nodes('/Order/ShippingInformation') t(x) 
      WHERE orderXML Is Not Null) s 

除了我试图在FROM子查询中选择的最后一列之外,此查询正常工作。

不同之处在于该列(ShippingMethod)不是单例。 XML包含所有的送货方式,我想选择SELECTED送货方式的ID。这是什么XML的部分看起来像...

<Order>... 
    <ShippingInformation> 
     <ShipTo> 
      <Name>DONT SHOW</Name> 
      <Attention>DONT SHOW</Attention> 
      <Street1>DONT SHOW</Street1> 
      <Street2 /> 
      <Subdivision1>DONT SHOW</Subdivision1> 
      <Subdivision2>IL</Subdivision2> 
      <PostalCode>62092</PostalCode> 
      <CountryCode>US</CountryCode> 
      <AllowEmptyShipTo>0</AllowEmptyShipTo> 
      <ContactInfo>DONT SHOW</ContactInfo> 
     </ShipTo> 
     <ShippingMethods> 
      <ShippingMethod> 
       <ID>UPSGROUND</ID> 
       <Selected>1</Selected> 
       <Cost>134.08</Cost> 
      </ShippingMethod> 
      <ShippingMethod> 
       <ID>PICKUP</ID> 
       <Selected>0</Selected> 
       <Cost>0</Cost> 
      </ShippingMethod> 
      <ShippingMethod> 
       <ID>UPS3DAY</ID> 
       <Selected>0</Selected> 
       <Cost>288.46</Cost> 
      </ShippingMethod> 
      <ShippingMethod> 
       <ID>UPS2DAY</ID> 
       <Selected>0</Selected> 
       <Cost>347.91</Cost> 
      </ShippingMethod> 
      <ShippingMethod> 
       <ID>UPSNEXTBUSDAY</ID> 
       <Selected>0</Selected> 
       <Cost>956.73</Cost> 
      </ShippingMethod> 
     </ShippingMethods> 
    </ShippingInformation> 
...</Order> 

如何选择SELECTED送货方式ID?

赛斯

回答

3

可以在XQuery表达式使用谓词对Selected

这将选取第一个ShippingMethod节点,其中Selected的值为1

x.value('(./ShippingMethods/ShippingMethod[Selected = 1]/ID)[1]','VARCHAR(255)') 
相关问题