Aracılığıyla paylaş


Yönlendirme İfadeleri - Koşul Belirtme

Şunlar için geçerlidir: SQL Server

XQuery'deki Yol İfadeleri konusunda açıklandığı gibi, yol ifadesindeki bir eksen adımı aşağıdaki bileşenleri içerir:

İsteğe bağlı koşul, yol ifadesindeki eksen adımının üçüncü bölümüdür.

Yüklemler

Bir koşul, belirtilen testi uygulayarak bir düğüm dizisini filtrelemek için kullanılır. Koşul ifadesi köşeli ayraç içine alınır ve yol ifadesindeki son düğüme bağlıdır.

Örneğin, xml veri türünün SQL parametre değerinin (x) aşağıda gösterildiği gibi bildirildiğini varsayalım:

declare @x xml  
set @x = '  
<People>  
  <Person>  
    <Name>John</Name>  
    <Age>24</Age>  
  </Person>  
  <Person>  
    <Name>Goofy</Name>  
    <Age>54</Age>  
  </Person>  
  <Person>  
    <Name>Daffy</Name>  
    <Age>30</Age>  
  </Person>  
</People>  
'  

Bu durumda, üç farklı düğüm düzeyinin her birinde [1] koşul değeri kullanan geçerli ifadeler aşağıdadır:

select @x.query('/People/Person/Name[1]')  
select @x.query('/People/Person[1]/Name')  
select @x.query('/People[1]/Person/Name')  

Her durumda koşulunun uygulandığı yol ifadesindeki düğüme bağlandığını unutmayın. Örneğin, ilk yol ifadesi her /People/Person düğümündeki ilk <Name> öğeyi seçer ve sağlanan XML örneğiyle aşağıdakileri döndürür:

<Name>John</Name><Name>Goofy</Name><Name>Daffy</Name>  

Ancak, ikinci yol ifadesi ilk /People/Person düğümü altındaki tüm <Name> öğeleri seçer. Bu nedenle, aşağıdakileri döndürür:

<Name>John</Name>  

Ayraçlar, koşulun değerlendirme sırasını değiştirmek için de kullanılabilir. Örneğin, aşağıdaki ifadede (/People/Person/Name) yolunu [1] koşulundan ayırmak için bir parantez kümesi kullanılır:

select @x.query('(/People/Person/Name)[1]')  

Bu örnekte, koşulun uygulanma sırası değişir. Bunun nedeni, kapalı yolun önce değerlendirilir (/Kişiler/Kişi/Ad) ve ardından [1] koşulu işlecinin, kapalı yolla eşleşen tüm düğümleri içeren kümeye uygulanmasıdır. Parantezler olmadan, ilk yol ifadesi örneğine benzer şekilde [1] düğüm testi olarak child::Name uygulandığından işlem sırası farklı olabilir.

Niceleyiciler ve Koşul

Niceleyiciler, koşulun ayraçlarının içine birden fazla kez kullanılabilir ve eklenebilir. Örneğin, önceki örneği kullanarak, aşağıdaki karmaşık bir koşul alt ifadesi içinde birden fazla niceleyicinin geçerli bir kullanımıdır.

select @x.query('/People/Person[contains(Name[1], "J") and xs:integer(Age[1]) < 40]/Name/text()')  

Koşul ifadesinin sonucu Boole değerine dönüştürülür ve koşul doğruluk değeri olarak adlandırılır. Sonuçta yalnızca koşul doğruluk değerinin True olduğu dizideki düğümler döndürülür. Diğer tüm düğümler atılır.

Örneğin, aşağıdaki yol ifadesi ikinci adımında bir koşul içerir:

/child::root/child::Location[attribute::LocationID=10]  

Bu koşul tarafından belirtilen koşul tüm öğe düğümü alt öğelerine <Location> uygulanır. Sonuç, yalnızca LocationID öznitelik değeri 10 olan iş merkezi konumlarının döndürülür.

Önceki yol ifadesi aşağıdaki SELECT deyiminde yürütülür:

SELECT Instructions.query('  
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
 /child::AWMI:root/child::AWMI:Location[attribute::LocationID=10]  
')  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Bilgi İşlem Koşulu Doğruluk Değerleri

XQuery belirtimlerine göre koşul gerçek değerini belirlemek için aşağıdaki kurallar uygulanır:

  1. Koşul ifadesinin değeri boş bir diziyse, koşul gerçeği değeri False olur.

    Örneğin:

    SELECT Instructions.query('  
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
     /child::AWMI:root/child::AWMI:Location[attribute::LotSize]  
    ')  
    FROM Production.ProductModel  
    WHERE ProductModelID=7  
    

    Bu sorgudaki yol ifadesi yalnızca LotSize özniteliği belirtilen öğe düğümlerini <Location> döndürür. Koşul belirli <Location>bir için boş bir dizi döndürürse, sonuçta bu iş merkezi konumu döndürülür.

  2. Koşul değerleri yalnızca xs:integer, xs:Boole veya node* olabilir. Düğüm* için koşul, düğüm varsa True ve boş bir dizi için False olarak değerlendirilir. Çift ve kayan tür gibi diğer herhangi bir sayısal tür statik yazma hatası oluşturur. Bir ifadenin koşul gerçeği değeri, yalnızca elde edilen tamsayı bağlam konumunun değerine eşitse True olur. Ayrıca, yalnızca tamsayı değişmez değerleri ve last() işlevi filtrelenmiş adım ifadesinin kardinalitesini 1 olarak azaltır.

    Örneğin, aşağıdaki sorgu öğenin üçüncü alt öğe düğümünü <Features> alır.

    SELECT CatalogDescription.query('  
    declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
    declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
     /child::PD:ProductDescription/child::PD:Features/child::*[3]  
    ')  
    FROM Production.ProductModel  
    WHERE ProductModelID=19  
    

    Önceki sorgudan aşağıdakilere dikkat edin:

    • İfadedeki üçüncü adım, değeri 3 olan bir koşul ifadesi belirtir. Bu nedenle, bu ifadenin koşul gerçeği değeri yalnızca bağlam konumu 3 olan düğümler için True'dur.

    • Üçüncü adım ayrıca düğüm testindeki tüm düğümleri gösteren bir joker karakter (*) belirtir. Ancak koşul, düğümleri filtreler ve yalnızca üçüncü konumdaki düğümü döndürür.

    • Sorgu, belge kökü öğesi alt öğelerinin <Features> öğe alt öğelerinin <ProductDescription> üçüncü alt öğe düğümünü döndürür.

  3. Koşul ifadesinin değeri Boole türünde basit bir tür değeriyse, koşul gerçeği değeri koşul ifadesinin değerine eşittir.

    Örneğin, müşteri anketi XML örneği olan XML örneğini barındıran xml türü değişkeninde aşağıdaki sorgu belirtilir. Sorgu, alt öğeleri olan müşterileri alır. Bu sorguda, bu HasChildren<1>/HasChildren< olacaktır>.

    declare @x xml  
    set @x='  
    <Survey>  
      <Customer CustomerID="1" >  
      <Age>27</Age>  
      <Income>20000</Income>  
      <HasChildren>1</HasChildren>  
      </Customer>  
      <Customer CustomerID="2" >  
      <Age>27</Age>  
      <Income>20000</Income>  
      <HasChildren>0</HasChildren>  
      </Customer>  
    </Survey>  
    '  
    declare @y xml  
    set @y = @x.query('  
      for $c in /child::Survey/child::Customer[( child::HasChildren[1] cast as xs:boolean ? )]  
      return   
          <CustomerWithChildren>  
              { $c/attribute::CustomerID }  
          </CustomerWithChildren>  
    ')  
    select @y  
    

    Önceki sorgudan aşağıdakilere dikkat edin:

    • for döngüsündeki ifadenin iki adımı vardır ve ikinci adım bir koşul belirtir. Bu koşulun değeri bir Boole türü değeridir. Bu değer True ise, koşulun doğruluk değeri de True olur.

    • Sorgu, belge kökünün <Customer> Survey< öğesi alt öğelerinin >koşul değeri True olan alt öğelerini döndürür. Sonuç şu şekildedir:

      <CustomerWithChildren CustomerID="1"/>   
      
  4. Koşul ifadesinin değeri en az bir düğüm içeren bir diziyse, koşul gerçeği değeri True olur.

Örneğin, aşağıdaki sorgu, XML kataloğu açıklaması < ön eki ile ilişkilendirilmiş ad alanından öğenin alt öğesi Features> olan en az bir özellik içeren ürün modelleri için ProductModelID değerini alır.

SELECT ProductModelID  
FROM   Production.ProductModel  
WHERE CatalogDescription.exist('  
             declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
             declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
             /child::PD:ProductDescription/child::PD:Features[wm:*]  
             ') = 1  

Önceki sorgudan aşağıdakilere dikkat edin:

  • WHERE yan tümcesi exist() yöntemini (XML veri türü) belirtir.

  • exist() yönteminin içindeki yol ifadesi, ikinci adımda bir koşul belirtir. Koşul ifadesi en az bir özellik dizisi döndürürse, bu koşul ifadesinin doğruluk değeri True olur. Bu durumda, exist() yöntemi true döndürdüğünden ProductModelID döndürülür.

Statik Yazma ve Koşul Filtreleri

Koşul, bir ifadenin statik olarak çıkarım yapılan türünü de etkileyebilir. Tamsayı değişmez değerleri ve last() işlevi, filtrelenmiş adım ifadesinin kardinalitesini en fazla bir değere düşürür.