Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 namespacesorguda 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