Aracılığıyla paylaş


Karşılaştırma İfadeleri (XQuery)

Şunlar için geçerlidir: SQL Server

XQuery aşağıdaki karşılaştırma işleç türlerini sağlar:

  • Genel karşılaştırma işleçleri

  • Değer karşılaştırma işleçleri

  • Düğüm karşılaştırma işleçleri

  • Düğüm sırası karşılaştırma işleçleri

Genel Karşılaştırma İşleçleri

Genel karşılaştırma işleçleri atomik değerleri, dizileri veya ikisinin herhangi bir bileşimini karşılaştırmak için kullanılabilir.

Genel işleçler aşağıdaki tabloda tanımlanmıştır.

Operatör Açıklama
= Eşit
!= Eşit değil
< Daha az
> Daha büyük
<= Küçüktür ya da eşittir
>= Büyüktür veya eşittir

Genel karşılaştırma işleçlerini kullanarak iki diziyi karşılaştırdığınızda ve ikinci dizide True değerini ilk sıradaki bir değerle karşılaştıran bir değer varsa, genel sonuç True olur. Aksi takdirde False olur. Örneğin, (1, 2, 3) = (3, 4) True değeridir çünkü 3 değeri her iki sırada da görünür.

declare @x xml  
set @x=''  
select @x.query('(1,2,3) = (3,4)')    

Karşılaştırma, değerlerin karşılaştırılabilir türlerde olmasını bekler. Bunlar özellikle statik olarak denetleniyor. Sayısal karşılaştırmalar için sayısal tür yükseltmesi gerçekleşebilir. Örneğin, 10 ondalık değeri 1e1 çift değeriyle karşılaştırılırsa, ondalık değer çift olarak değiştirilir. Çift karşılaştırmalar tam olarak yapılamadığından, bunun çok basit sonuçlar oluşturabileceğini unutmayın.

Değerlerden biri yazılmamışsa, diğer değerin türüne geçirilir. Aşağıdaki örnekte, 7 değeri tamsayı olarak değerlendirilir. Karşılaştırılmadan önce, /a[1] yazılmamış değeri tamsayıya dönüştürülür. Tamsayı karşılaştırması True döndürür.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < 7')  

Buna karşılık, yazılmamış değer bir dizeyle veya başka bir yazılmamış değerle karşılaştırılırsa, xs:string'e yayınlanır. Aşağıdaki sorguda, 6 dizesi "17" dizesiyle karşılaştırılır. Dize karşılaştırması nedeniyle aşağıdaki sorgu False döndürür.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < "17"')  

Aşağıdaki sorgu, AdventureWorks örnek veritabanında sağlanan ürün kataloğundan bir ürün modelinin küçük boyutlu resimlerini döndürür. Sorgu, tarafından PD:ProductDescription/PD:Picture/PD:Size döndürülen atomik değerlerin bir dizisini tek bir sıra olan "small" ile karşılaştırır. Karşılaştırma True ise Picture< öğesini döndürür>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)  
SELECT CatalogDescription.query('         
    for $P in /PD:ProductDescription/PD:Picture[PD:Size = "small"]         
    return $P') as Result         
FROM   Production.ProductModel         
WHERE  ProductModelID=19         

Aşağıdaki sorgu, sayı< öğelerindeki >telefon numaraları dizisini "112-111-1111" dize değişmez değeriyle karşılaştırır. Sorgu, belgede belirli bir müşteri için belirli bir telefon numarasının mevcut olup olmadığını belirlemek için AdditionalContactInfo sütunundaki telefon numarası öğelerinin sırasını karşılaştırır.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.value('         
   /aci:AdditionalContactInfo//act:telephoneNumber/act:number = "112-111-1111"', 'nvarchar(10)') as Result         
FROM Person.Contact         
WHERE ContactID=1         

Sorgu True döndürür. Bu, numaranın belgede mevcut olduğunu gösterir. Aşağıdaki sorgu, önceki sorgunun biraz değiştirilmiş bir sürümüdür. Bu sorguda, belgeden alınan telefon numarası değerleri iki telefon numarası değeri dizisiyle karşılaştırılır. Karşılaştırma True ise number <> öğesi döndürülür.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('         
  if (/aci:AdditionalContactInfo//act:telephoneNumber/act:number = ("222-222-2222","112-111-1111"))         
  then          
     /aci:AdditionalContactInfo//act:telephoneNumber/act:number         
  else         
    ()') as Result         
FROM Person.Contact         
WHERE ContactID=1  
  

Sonuç şu şekildedir:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    112-111-1111  
\</act:number>   

Değer Karşılaştırma İşleçleri

Atomik değerleri karşılaştırmak için değer karşılaştırma işleçleri kullanılır. Sorgularınızda değer karşılaştırma işleçleri yerine genel karşılaştırma işleçlerini kullanabileceğinizi unutmayın.

Değer karşılaştırma işleçleri aşağıdaki tabloda tanımlanmıştır.

Operatör Açıklama
Eq Eşit
ne Eşit değil
litre Daha az
GT Daha büyük
Le Küçüktür ya da eşittir
Ge Büyüktür veya eşittir

İki değer aynı değeri seçilen işleçle karşılaştırırsa, ifade True döndürür. Aksi takdirde False döndürür. Değerlerden biri boş bir diziyse, ifadenin sonucu False olur.

Bu işleçler yalnızca tek atomik değerler üzerinde çalışır. Başka bir ifadeyle, bir diziyi işlenenlerden biri olarak belirtemezsiniz.

Örneğin, aşağıdaki sorgu, resim boyutunun "küçük olduğu bir ürün modeli için Resim öğelerini alır<>:

SELECT CatalogDescription.query('         
              declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";         
              for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]         
              return         
                    $P         
             ') as Result         
FROM Production.ProductModel         
WHERE ProductModelID=19         

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

  • declare namespace sorguda daha sonra kullanılan ad alanı ön ekini tanımlar.

  • <Boyut> öğesi değeri belirtilen atomik değer olan "small" ile karşılaştırılır.

  • Değer işleçleri yalnızca atomik değerler üzerinde çalıştığından data() işlevinin düğüm değerini almak için örtük olarak kullanıldığını unutmayın. Yani aynı data($P/PD:Size) eq "small" sonucu verir.

Sonuç şu şekildedir:

\<PD:Picture   
  xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
  \<PD:Angle>front\</PD:Angle>  
  \<PD:Size>small\</PD:Size>  
  \<PD:ProductPhotoID>31\</PD:ProductPhotoID>  
\</PD:Picture>  

Değer karşılaştırmaları için tür yükseltme kurallarının genel karşılaştırmalarla aynı olduğunu unutmayın. Ayrıca SQL Server, değer karşılaştırmaları sırasında türlenmemiş değerler için genel karşılaştırmalar sırasında kullandığıyla aynı atama kurallarını kullanır. Buna karşılık, XQuery belirtimindeki kurallar, değer karşılaştırmaları sırasında her zaman yazılmamış değeri xs:string olarak dönüştürür.

Düğüm Karşılaştırma İşleci

Düğüm karşılaştırma işleci , yalnızca düğüm türleri için geçerlidir. Döndürdüğü sonuç, işlenen olarak geçirilen iki düğümün kaynak belgedeki aynı düğümü temsil edip etmediğini gösterir. bu işleç, iki işlenen aynı düğümse True döndürür. Aksi takdirde False döndürür.

Aşağıdaki sorgu, iş merkezi konumu 10'un belirli bir ürün modelinin üretim sürecinde ilk olup olmadığını denetler.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS AWMI)  
  
SELECT ProductModelID, Instructions.query('         
    if (  (//AWMI:root/AWMI:Location[@LocationID=10])[1]         
          is          
          (//AWMI:root/AWMI:Location[1])[1] )          
    then         
          <Result>equal</Result>         
    else         
          <Result>Not-equal</Result>         
         ') as Result         
FROM Production.ProductModel         
WHERE ProductModelID=7           

Sonuç şu şekildedir:

ProductModelID       Result          
-------------- --------------------------  
7              <Result>equal</Result>      

Düğüm Sırası Karşılaştırma İşleçleri

Düğüm sırası karşılaştırma işleçleri, düğüm çiftlerini belgedeki konumlarına göre karşılaştırır.

Belge sırasına göre yapılan karşılaştırmalar şunlardır:

  • << : İşlenen 1 , işlenen 2'nin önüne belge sırasına göre eklenir.

  • >> : İşlenen 1 , işlenen 2'yi belge sırasına göre izler mi?

Aşağıdaki sorgu, ürün kataloğu açıklamasında belirli bir ürünün belge sırasına <göre Bakım> öğesinden önce <görünen Warranty> öğesi varsa True döndürür.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
  
SELECT CatalogDescription.value('  
     (/PD:ProductDescription/PD:Features/WM:Warranty)[1] <<   
           (/PD:ProductDescription/PD:Features/WM:Maintenance)[1]', 'nvarchar(10)') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

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

  • Sorguda xml veri türünün value() yöntemi kullanılır.

  • Sorgunun Boole sonucu nvarchar(10) değerine dönüştürülür ve döndürülür.

  • Sorgu True döndürür.

Ayrıca Bkz.

Tür Sistemi (XQuery)
XQuery İfadeleri