2012-08-16 58 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)') 
相關問題