Aracılığıyla paylaş


Karşılaştırma ifadeleri (XQuery)

XQuery karşılaştırma işleçleri aşağıdaki 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 sipariş karşılaştırma işleçleri

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

Genel karşılaştırma işleçleri Atomik değerleri, sıraları veya her ikisinin birleşimini karşılaştırmak için kullanılabilir.

Genel işleçleri aşağıdaki tanımlanmış olan tablo.

İşleç

Açıklama

=

Equal

!=

Eşit değildir

<

Küçüktür

>

Büyüktür

<=

Küçüktür veya eşittir

>=

Büyüktür veya eşittir

Genel karşılaştırma işleçleri kullanarak iki sıraları karşılaştırma ve ikinci sıradaki ilk sıralamasında bir değer True deðerinden karşılaştıran bir değeri varsa, genel sonuç True olur.Aksi takdirde, False olur.Örneğin, (1, 2, 3) = (3, 4) True, çünkü her iki sıralarında 3 değeri görüntülenir.

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

Karşılaştırma değerleri benzer türde olduğunu umuyor.Özellikle, bunlar statik olarak denetlenir.Sayısal karşılaştırmalar için sayısal tür promosyon oluşabilir.Örneğin, bir çift değer 1e1 10 ondalık değeri karşılaştırılır, ondalık değer çift olarak değiştirilir.Çift karşılaştırmaları tam olamaz çünkü bu değerde kesinlik hatalı sonuçlar oluşturabileceğini unutmayın.

Değerlerden biri untyped ise, diğer değer türünü artığını.Aşağıdaki örnekte, 7 değer bir tamsayı kabul edilir./A [1] untyped değeri karşılaştırıldığında önce bir tamsayıya dönüştürülür.Tamsayı karşılaştırma doğru sonucunu verir.

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

Untyped değerini bir dize ya da başka bir untyped değeri karşılaştırılır, tam tersine, onu xs:string için almadaki.Aşağıdaki sorgu, dize 6 karşılaştırması dize "17".Aşağıdaki sorgu dize karşılaştırma yanlış döndürür.

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

Sağlanan Ürün Kataloğu'ndan ürün modelinin küçük boyutlu resimler aşağıdaki sorgu döndürür AdventureWorks2008R2 örnek veritabanı.Sorgu tarafından döndürülen Atomik değerlerin dizisini karşılaştırır PD:ProductDescription/PD:Picture/PD:Size "küçük" singleton sırası ile.Karşılaştırma doğru ise, verir <resmi> öğesi.

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 bir dizi telefon numaraları karşılaştırır <sayısı> öğeleri dize literal "112-111-1111".Sorgu telefon numarası öğeleri belgede belirli bir müşteri için özel bir telefon numarası olup olmadığını belirlemek için AdditionalContactInfo sütun dizisini 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.Person       
WHERE BusinessEntityID = 291;       

Sorgu True verir.Bu sayı belgede var olduğunu gösterir.Önceki sorgu biraz değiştirilmiş bir sürüm aşağıdaki sorgudur.Bu sorgu, bir iki telefon sayı değerleri serisi için belgeden alınan telefon sayı değerleri karşılaştırılır.Karşılaştırma True ise, <sayısı> öğe 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.Person       
WHERE BusinessEntityID = 293;
       

Bu sonucu verir:

<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 işleçleri

Değer karşılaştırma işleçleri Atomik değerleri karşılaştırmak için kullanılır.Genel karşılaştırma işleçleri sorgularınızda değer karşılaştırma işleçleri yerine, kullanabileceğinizi unutmayın.

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

İşleç

Açıklama

EQ

Equal

ne

Eşit değildir

lt

Küçüktür

gt

Büyüktür

le

Küçüktür veya eşittir

GE

Büyüktür veya eşittir

İki aynı göre seçilen karşılaştıran, işleç, deyim True döner.Aksi takdirde, False döndürür.Her iki değer boş bir sıra, sonucu olup olmadığını ifade yanlış.

Bu operatörler singleton Atomik değerlerin üzerinde yalnızca çalışır.Diğer bir deyişle, işlenen biri olarak bir sıra belirtemezsiniz.

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

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 daha sonra kullanılan ad alaný önekini sorguda tanımlar.

  • The <Size> element value is compared with the specified atomic value, "small".

  • Değer işleçleri yalnızca Atomik değerlerin üzerinde çalıştıkları dikkat data() işlev düğüm değerini almak için kullanılan örtülü.Yani, data($P/PD:Size) eq "small" üreten aynı sonucu.

Bu sonucu verir:

<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 promosyon kuralları genel karşılaştırmaları aynı olduğunu unutmayın.Ayrıca, SQL Server gibi kullandığı genel Karşılaştırma sırasında değer karşılaştırmaları sırasında untyped değerleri aynı çevrim kurallarını kullanırBuna karşılık, kurallar her zaman XQuery belirtiminde untyped xs:dize değerine değer karşılaştırmaları sırasında artığını.

Düğüm karşılaştırma işleci

Düğüm karşılaştırma işleç, is, uygulandığı sadece düğüm türleri.Döndürdüğü sonucu işlenen olarak geçirilen iki düğüm kaynak belgede aynı düğüme gösterip göstermediğini belirtir.Bu işleç, iki işlenen aynı düğüm ise doğru sonucunu verir.Aksi takdirde, False değerini döndürür.

Aşağıdaki sorgu 10 iş merkezi konumu üretim sürecindeki belirli ürün modelinin 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         

Bu sonucu verir:

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

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

Düğüm sipariş karşılaştırma işleçleri çifti, düğüm, bir belge içindeki konumlarına göre karşılaştırın.

Belge siparişi temel alarak yapılan karşılaştırmalar şunlardır:

  • <<: Mu 1 işleneniyle önüne işlenen 2 belgeyi sırayla.

  • >>: Mu 1 işleneniyle izleyin işlenen 2 belgeyi sırayla.

Ürün Katalog açıklaması varsa, aşağıdaki sorgu True verir <garanti> önce görünen öğe <Bakım> elemanı belge sipariş için belirli bir ürün.

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:

  • The value() method of the xmldata type is used in the query.

  • Boole sorgunun sonucunu dönüştürülür nvarchar(10) ve döndürülen.

  • Sorgu True verir.

Ayrıca bkz.

Kavramlar