Megosztás:


Összehasonlító kifejezések (XQuery)

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 namespace hatá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