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.