Megosztás:


Elérésiút-kifejezések – Predikátumok megadása

A következőkre vonatkozik:SQL Server

A témakörben leírtaknak megfelelően az XQuery elérésiút-kifejezései, az elérésiút-kifejezések tengelylépései a következő összetevőket tartalmazzák:

Az opcionális predikátum a tengelylépés harmadik része egy elérésiút-kifejezésben.

Predikátumok

Egy predikátum egy csomópontütemezés szűrésére szolgál egy megadott teszt alkalmazásával. A predikátum kifejezés szögletes zárójelben van, és az elérési út kifejezésének utolsó csomópontjára van kötve.

Tegyük fel például, hogy az XML-adattípushoz tartozó SQL-paraméter értéke (x) deklarálva van, ahogyan az a következő ábrán látható:

declare @x xml  
set @x = '  
<People>  
  <Person>  
    <Name>John</Name>  
    <Age>24</Age>  
  </Person>  
  <Person>  
    <Name>Goofy</Name>  
    <Age>54</Age>  
  </Person>  
  <Person>  
    <Name>Daffy</Name>  
    <Age>30</Age>  
  </Person>  
</People>  
'  

Ebben az esetben a következők olyan érvényes kifejezések, amelyek három különböző csomópontszinten [1] predikátumértéket használnak:

select @x.query('/People/Person/Name[1]')  
select @x.query('/People/Person[1]/Name')  
select @x.query('/People[1]/Person/Name')  

Vegye figyelembe, hogy a predikátum minden esetben a csomóponthoz kötődik abban az elérésiút-kifejezésben, ahol az alkalmazásra kerül. Az első elérési út kifejezés például kiválasztja az első <Name> elemet az egyes /People/Person csomópontokon belül, és a megadott XML-példánnyal a következőket adja vissza:

<Name>John</Name><Name>Goofy</Name><Name>Daffy</Name>  

A második elérési út kifejezés azonban kijelöli az első /Személyek/Személy csomópont alatt lévő összes <Name> elemet. Ezért a következőket adja vissza:

<Name>John</Name>  

A zárójelek a predikátum kiértékelési sorrendjének módosítására is használhatók. A következő kifejezésben például zárójelek halmaza választja el a (/Személyek/Személyek/Név) elérési útját a predikátumtól [1]:

select @x.query('(/People/Person/Name)[1]')  

Ebben a példában a predikátum alkalmazásának sorrendje módosul. Ennek az az oka, hogy a zárt elérési utat először kiértékeli a rendszer (/Személyek/Személyek/Személy/Név), majd az [1] predikátum operátort alkalmazza a rendszer az összes olyan csomópontot tartalmazó készletre, amely megfelel a zárt elérési útnak. A zárójelek nélkül a művelet sorrendje abban különbözne, hogy az [1] csomóponttesztként child::Name lesz alkalmazva, hasonlóan az első elérésiút-kifejezés példájához.

Kvantitátorok és predikátumok

A kvantátorok a predikátum kapcsos zárójelei között több alkalommal is használhatók és hozzáadhatók. Az előző példában például a következő egynél több kvantáló érvényes használata egy összetett predikátum alexpresszión belül.

select @x.query('/People/Person[contains(Name[1], "J") and xs:integer(Age[1]) < 40]/Name/text()')  

A predikátumkifejezés eredménye logikai értékké alakul, és predikátum-igazságértéknek nevezzük. Az eredményben csak azok a csomópontok lesznek visszaadva, amelyeknél a predikátum igazságértéke igaz. A rendszer minden más csomópontot elvet.

A következő elérésiút-kifejezés például tartalmaz egy predikátumot a második lépésben:

/child::root/child::Location[attribute::LocationID=10]  

A predikátum által megadott feltétel az összes <Location> elemcsomópont-gyermekre vonatkozik. Az eredmény az, hogy a rendszer csak azokat a műhelyhelyeket adja vissza, amelyek LocationID attribútumértéke 10.

Az előző elérési út kifejezése a következő SELECT utasításban lesz végrehajtva:

SELECT Instructions.query('  
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
 /child::AWMI:root/child::AWMI:Location[attribute::LocationID=10]  
')  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Számítástechnikai predikátum igazságértékek

A predikátum igazságértékének meghatározásához a következő szabályokat kell alkalmazni az XQuery specifikációinak megfelelően:

  1. Ha a predikátum kifejezés értéke üres sorozat, a predikátum igazságértéke Hamis.

    Például:

    SELECT Instructions.query('  
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
     /child::AWMI:root/child::AWMI:Location[attribute::LotSize]  
    ')  
    FROM Production.ProductModel  
    WHERE ProductModelID=7  
    

    A lekérdezés elérési útjának kifejezése csak azokat az <Location> elemcsomópontokat adja vissza, amelyekhez LotSize attribútum van megadva. Ha a predikátum üres sorozatot ad vissza egy adotthoz <Location>, akkor az adott műhely helye nem lesz visszaadva az eredményben.

  2. A predikátumértékek csak xs:egész szám, xs:logikai vagy csomópont*lehetnek. Csomópont*esetén a predikátum igaz értéket ad vissza, ha vannak csomópontok, és hamis értéket egy üres sorozathoz. Bármely más numerikus típus, például kettős és lebegőpontos típus statikus gépelési hibát okoz. Egy kifejezés predikátum-igazságértéke Igaz, ha és csak akkor, ha az eredményül kapott egész szám megegyezik a környezeti pozíció értékével. Emellett csak az egész szám konstans értékei és az utolsó() függvény csökkenti a szűrt lépéskifejezés számosságát 1-re.

    Az alábbi lekérdezés például lekéri az elem harmadik gyermekelem-csomópontját <Features> .

    SELECT CatalogDescription.query('  
    declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
    declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
     /child::PD:ProductDescription/child::PD:Features/child::*[3]  
    ')  
    FROM Production.ProductModel  
    WHERE ProductModelID=19  
    

    Jegyezze fel az előző lekérdezésben szereplő következőket:

    • A kifejezés harmadik lépése egy predikátumkifejezést határoz meg, amelynek értéke 3. Ezért a kifejezés predikátum-igazságértéke csak azokra a csomópontokra igaz, amelyek környezeti helyzete 3.

    • A harmadik lépés egy helyettesítő karaktert (*) is megad, amely a csomópontteszt összes csomópontját jelzi. A predikátum azonban szűri a csomópontokat, és csak a harmadik pozícióban lévő csomópontot adja vissza.

    • A lekérdezés a dokumentumgyökér gyermekelemei elem gyermekeinek harmadik gyermekelem-csomópontját <Features> adja vissza.<ProductDescription>

  3. Ha a predikátumkifejezés értéke egy logikai típusú egyszerű típusérték, a predikátum igazságértéke megegyezik a predikátumkifejezés értékével.

    A következő lekérdezés például egy XML-példányt tartalmazó XML-típusváltozón , az ügyfél felmérési XML-példányán van megadva. A lekérdezés lekéri azokat az ügyfeleket, akiknek gyermekük van. Ebben a lekérdezésben ez a HasChildren<1>/HasChildren< lesz>.

    declare @x xml  
    set @x='  
    <Survey>  
      <Customer CustomerID="1" >  
      <Age>27</Age>  
      <Income>20000</Income>  
      <HasChildren>1</HasChildren>  
      </Customer>  
      <Customer CustomerID="2" >  
      <Age>27</Age>  
      <Income>20000</Income>  
      <HasChildren>0</HasChildren>  
      </Customer>  
    </Survey>  
    '  
    declare @y xml  
    set @y = @x.query('  
      for $c in /child::Survey/child::Customer[( child::HasChildren[1] cast as xs:boolean ? )]  
      return   
          <CustomerWithChildren>  
              { $c/attribute::CustomerID }  
          </CustomerWithChildren>  
    ')  
    select @y  
    

    Jegyezze fel az előző lekérdezésben szereplő következőket:

    • A ciklus kifejezésének két lépése van, a második lépés pedig egy predikátumot határoz meg. Ennek a predikátumnak az értéke logikai típusú érték. Ha ez az érték Igaz, akkor a predikátum igazságértéke is Igaz.

    • A lekérdezés visszaadja a <Customer> dokumentumgyökerű Felmérés< elem gyermekeinek gyermekeit, akiknek a predikátumértéke Igaz>. Ez az eredmény:

      <CustomerWithChildren CustomerID="1"/>   
      
  4. Ha a predikátumkifejezés értéke olyan sorozat, amely legalább egy csomópontot tartalmaz, a predikátum igazságértéke Igaz.

Az alábbi lekérdezés például lekéri a ProductModelID azonosítót azokhoz a termékmodellekhez, amelyek XML-katalógusának leírása tartalmaz legalább egy funkciót, az <Features> elem gyermekelemét a wm előtaggal társított névtérből.

SELECT ProductModelID  
FROM   Production.ProductModel  
WHERE CatalogDescription.exist('  
             declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
             declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
             /child::PD:ProductDescription/child::PD:Features[wm:*]  
             ') = 1  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • A WHERE záradék a exist() metódust (XML-adattípust) adja meg.

  • A exist() metódusban található elérésiút-kifejezés egy predikátumot határoz meg a második lépésben. Ha a predikátum kifejezés legalább egy jellemző sorozatát adja vissza, ennek a predikátumkifejezésnek az igazságértéke Igaz. Ebben az esetben, mivel a exist() metódus true értéket ad vissza, a ProductModelID lesz visszaadva.

Statikus gépelési és predikátumszűrők

A predikátumok hatással lehetnek a kifejezés statikusan kikövetkeztetett típusára is. Az egész szám konstans értékei és az utolsó() függvény legfeljebb egyre csökkenti a szűrt lépéskifejezés számosságát.