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çler aşağıdaki tabloda tanımlanır.

Operatör

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ırdığınız ve ilk sıra değeri karşılaştırır ikinci sıradaki bir değeri var, genel sonuç True olur. Aksi takdirde, False olur. Örneğin, (1, 2, 3) = (3, 4) gerçek, çünkü hem sıralarında 3 değeri görüntülenir.

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

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

Değerlerden yazılmamış ise, diğer değer türü için atıldı. Aşağıdaki örnek, bir tamsayı olarak değeri 7 değerlendirilir. Karşılaştırılan önce /a [1] yazılmamış değeri tamsayıya dönüştürülür. Tamsayı karşılaştırması, doğru verir.

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

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

Yazılmamış değer bir dize veya bir başka yazılmamış değeri karşılaştırılır, tersine, bu XS için döküm. Aşağıdaki sorgu dizesini 6 dize "17" karşılaştırılır. Aşağıdaki sorgu, dize karşılaştırma nedeniyle False döndürür.

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

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ğu'ndan ürün modeli küçük boyutlu resimler verir. Sorgu tarafından döndürülen atomik değerleri dizisi karşılaştırır PD:ProductDescription/PD:Picture/PD:Sizeile "küçük" bir tek sıra. Karşılaştırma doğru ise eğer, onu döndürür <resim> öğ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       
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 belirli telefon numarası belirli bir müşteri için belge içinde 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.Contact       
WHERE ContactID=1       
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 verir. Bu sayı belgede varolduğunu gösterir. Önceki sorgu hafifçe değiştirilmiş bir sürümünü aşağıdaki sorgudur. Bu sorgu, iki telefon numarası değerleri dizisi için belgeden adresinden alındı telefon sayı değerleri karşılaştırılır. Karşılaştırma doğru 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.Contact       
WHERE ContactID=1
       
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ç şudur:

<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> 

<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. Not Genel karşılaştırma işleçleri, sorguları yerine değer karşılaştırma işleçleri kullanabilirsiniz.

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

Operatör

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 değeri karşılaştırmak seçilen operatöre göre aynı ifade True döndürecektir. Aksi takdirde False döndürür. Ya da değer boş bir sıra ise, deyimin sonucu False olur.

Bu işleçleri yalnızca tek atomik değerleri üzerinde çalışır. Yani, bir sıra işlenenler biri olarak belirtemezsiniz.

Örneğin, aşağıdaki sorgu alır <resim> resim boyutu olduğu ürün modeli öğ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       
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 namespacedaha sonra kullanılan ad alanı önekini sorguda tanımlar.

  • <Size> atomik değeri belirtilen ile "küçük" öğe değeri karşılaştırılır.

  • Çünkü değer işleçleri yalnızca atomik değerleri, iş dikkat data() işlevi örtük olarak düğüm değerini almak için kullanılır. Yani, data($P/PD:Size) eq "small"aynı sonucu verir.

Sonuç şudur:

<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>

<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ırma türü promosyon kurallarını genel karşılaştırmaları için aynı olduğunu unutmayın. Ayrıca, SQL ServerGenel karşılaştırma sırasında kullandığı döküm kurallarına yazılmamış değerleri değer karşılaştırma sırasında kullanır. Buna karşılık, kurallar her zaman XQuery belirtiminde XS yazılmamış değerine değer karşılaştırma sırasında döküm.

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

Düğüm karşılaştırma işleci, is, sadece düğüm türleri için geçerlidir. Döndürdüğü sonucu işlenen geçirilen iki düğüm kaynak belgede aynı düğümde temsil olup olmadığını gösterir. Bu işleç, iki işlenen aynı düğüm ise, doğru verir. Aksi takdirde, yanlış'ı verir.

Aşağıdaki sorgu iş merkezi konumda 10 belirli bir ürün modeline üretim sürecini 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         
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ç şudur:

ProductModelID       Result        
-------------- --------------------------
7              <Result>equal</Result>    
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, belge içindeki konumlarını temel düğümleri çiftleri karşılaştırın.

Bu, belge sırasına göre yapılan karşılaştırmalar vardır:

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

  • >>: Yok işlenen 1 takip 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> öğesinin belirli bir ürün için belgeyi sırayla.

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

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:

  • Value() yöntemi xml sorguda veri türü kullanılır.

  • Sorgu Boolean sonucu dönüştürülür nvarchar(10) ve dönen.

  • Sorgu True verir.

Ayrıca bkz.

Kavramlar

Tür sistemi (XQuery)

XQuery ifadeleri