Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A következőkre vonatkozik:SQL Server
Az XQuery a következő típusú összehasonlító operátorokat biztosítja:
Általános összehasonlító operátorok
Érték-összehasonlító operátorok
Csomópont-összehasonlító operátorok
Csomóponti rendelések összehasonlító operátorai
Általános összehasonlító operátorok
Az általános összehasonlító operátorok az atomi értékek, szekvenciák vagy a kettő bármely kombinációjának összehasonlítására használhatók.
Az általános operátorok az alábbi táblázatban vannak definiálva.
| Operátor | Leírás |
|---|---|
| = | Egyenlő |
| != | Nem egyenlő |
| < | Kisebb, mint |
| > | Nagyobb, mint |
| <= | Kisebb vagy egyenlő |
| >= | Nagyobb vagy egyenlő |
Ha két sorozatot hasonlít össze általános összehasonlító operátorok használatával, és a második sorozatban létezik egy érték, amely az Igaz értéket hasonlítja össze az első sorozat egyik értékével, a teljes eredmény Igaz. Ellenkező esetben hamis. Például (1, 2, 3) = (3, 4) igaz, mert a 3 érték mindkét sorozatban megjelenik.
declare @x xml
set @x=''
select @x.query('(1,2,3) = (3,4)')
Az összehasonlítás arra számít, hogy az értékek hasonló típusúak. Pontosabban statikusan vannak ellenőrizve. Numerikus összehasonlítások esetén numerikus típusú előléptetés történhet. Ha például egy 10-et egy 1e1 dupla értékkel hasonlítunk össze, akkor a tizedesjegy értéke dupla értékre változik. Vegye figyelembe, hogy ez nem praktikus eredményeket hozhat, mert a kettős összehasonlítások nem pontosak.
Ha az egyik érték nincs begépelve, az a másik érték típusára lesz állítva. Az alábbi példában a 7 értéket egész számként kezeli a függvény. Az összehasonlítás előtt a rendszer az /a[1] nem beírt értékét egész számmá alakítja. Az egész szám összehasonlítása igaz értéket ad vissza.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < 7')
Ezzel szemben, ha a nem beírt értéket egy sztringhez vagy egy másik nem beírt értékhez hasonlítják, az xs:string értékre lesz állítva. A következő lekérdezésben a 6. sztring a "17" sztringgel van összehasonlítva. Az alábbi lekérdezés a sztringek összehasonlítása miatt hamis értéket ad vissza.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < "17"')
Az alábbi lekérdezés egy termékmodell kis méretű képeit adja vissza az AdventureWorks mintaadatbázisban megadott termékkatalógusból. A lekérdezés az PD:ProductDescription/PD:Picture/PD:Size által visszaadott atomi értékek sorozatát hasonlítja össze egy "kicsi" egytonos sorozattal. Ha az összehasonlítás Igaz, a <Kép> elemet adja vissza.
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
Az alábbi lekérdezés <számban lévő telefonszámok sorozatát hasonlítja össze> elemekben a "112-111-1111" sztringkonstanssal. A lekérdezés összehasonlítja az AdditionalContactInfo oszlop telefonszám-elemeinek sorrendjét annak megállapításához, hogy egy adott ügyfél adott telefonszáma létezik-e a dokumentumban.
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
A lekérdezés igaz értéket ad vissza. Ez azt jelzi, hogy a szám létezik a dokumentumban. Az alábbi lekérdezés az előző lekérdezés kissé módosított verziója. Ebben a lekérdezésben a dokumentumból lekért telefonszámértékek két telefonszámérték sorozatával vannak összehasonlítva. Ha az összehasonlítás igaz, a <szám> elem lesz visszaadva.
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
Ez az eredmény:
\<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>
Érték-összehasonlító operátorok
Az érték-összehasonlító operátorok az atomi értékek összehasonlítására szolgálnak. Vegye figyelembe, hogy a lekérdezésekben az érték-összehasonlító operátorok helyett általános összehasonlító operátorokat is használhat.
Az érték-összehasonlító operátorok az alábbi táblázatban vannak definiálva.
| Operátor | Leírás |
|---|---|
| Eq | Egyenlő |
| ne | Nem egyenlő |
| Lt | Kisebb, mint |
| Gt | Nagyobb, mint |
| Le | Kisebb vagy egyenlő |
| Ge | Nagyobb vagy egyenlő |
Ha a két érték ugyanazt hasonlítja össze a kiválasztott operátorral, a kifejezés Igaz értéket ad vissza. Ellenkező esetben hamis értéket ad vissza. Ha bármelyik érték üres sorozat, a kifejezés eredménye Hamis.
Ezek az operátorok csak egytonos atomértékeken működnek. Ez azt jelzi, hogy az operandusok egyikeként nem adhatja meg a sorozatot.
A következő lekérdezés például lekéri <Kép> elemeket egy termékmodellhez, ahol a kép mérete "kicsi:
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
Jegyezze fel az előző lekérdezésben szereplő következőket:
declare namespacehatározza meg a lekérdezésben később használt névtér-előtagot.A <Méret> elem értékét a megadott atomértékkel hasonlítjuk össze, "kicsi".
Vegye figyelembe, hogy mivel az értékoperátorok csak atomi értékeken működnek, a data() függvény implicit módon használatos a csomópont értékének lekéréséhez. Ez azt jelenti, hogy
data($P/PD:Size) eq "small"ugyanazt az eredményt hozza létre.
Ez az eredmény:
\<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>
Vegye figyelembe, hogy az érték-összehasonlítások típus-előléptetési szabályai megegyeznek az általános összehasonlításokkal. Emellett az SQL Server ugyanazokat az öntési szabályokat használja a nem beírt értékekre az érték-összehasonlítások során, mint az általános összehasonlítások során. Ezzel szemben az XQuery-specifikáció szabályai mindig xs:sztringre öntötték a nem beírt értéket az érték-összehasonlítások során.
Csomópont-összehasonlító operátor
A csomópont-összehasonlító operátor , csak a csomóponttípusokra vonatkozik. A visszaadott eredmény azt jelzi, hogy az operandusként átadott két csomópont ugyanazt a csomópontot jelöli-e a forrásdokumentumban. Ez az operátor igaz értéket ad vissza, ha a két operandus azonos csomópont. Ellenkező esetben hamis értéket ad vissza.
Az alábbi lekérdezés ellenőrzi, hogy egy adott termékmodell gyártási folyamatában a 10. helyen található-e a műhely.
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
Ez az eredmény:
ProductModelID Result
-------------- --------------------------
7 <Result>equal</Result>
Csomóponti rendelések összehasonlító operátorai
A csomópontrendelés-összehasonlító operátorok a dokumentumokban elfoglalt pozíciójuk alapján hasonlítják össze a csomópontpárokat.
A dokumentum sorrendje alapján készült összehasonlítások:
<<: 1. operandus megelőzi 2. operandus a dokumentum sorrendjében.>>: 1. operandus követi 2. operandus a dokumentum sorrendjében.
Az alábbi lekérdezés igaz értéket ad vissza, ha a termékkatalógus leírásában megjelenik a <Jótállás> elem az adott termék dokumentumrendelésében szereplő <Karbantartási> elem előtt.
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
Jegyezze fel az előző lekérdezésben szereplő következőket:
A lekérdezés az xml-adattípusérték() metódusát használja.
A lekérdezés logikai eredménye nvarchar(10) lesz, és visszaadja.
A lekérdezés igaz értéket ad vissza.
Lásd még:
Type System (XQuery)
XQuery-kifejezések