Udostępnij za pośrednictwem


Określanie predykatów na etapie wyrażenie ścieżka

As described in the topic, Path Expressions in XQuery, an axis step in a path expression includes the following components:

Opcjonalny predykat jest trzecią częścią kroku osi w wyrażeniu ścieżki.

Predykaty

Predykat służy do filtrowania sekwencji węzłów przez zastosowanie określonego testu.Wyrażenie predykatu jest ujęte w nawiasy kwadratowe i powiązane z ostatnim węzłem w wyrażeniu ścieżki.

Załóżmy na przykład, że została zadeklarowana wartość parametru SQL (x) typu danych xml w następujący sposób:

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>
'

W tym przypadku następujące wyrażenia są poprawnymi wyrażeniami, które korzystają z wartości predykatu [1] na każdym z trzech poziomów węzłów:

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

Należy zauważyć, że w każdym przypadku predykat wiąże węzeł w wyrażeniu ścieżki tam, gdzie został zastosowany.Na przykład pierwsze wyrażenie ścieżki wybiera pierwszy element <Name> w poszczególnych węzłach /People/Person i, wraz z podanym wystąpieniem XML, zwraca następujące dane:

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

Natomiast drugie wyrażenie ścieżki wybiera wszystkie elementy <Name>, które znajdują się poniżej pierwszego węzła /People/Person.Oznacza to, że są zwracane następujące dane:

<Name>John</Name>

Kolejność obliczania predykatu można także zmienić przy użyciu nawiasów.Na przykład w następującym wyrażeniu zestaw nawiasów oddziela ścieżkę (/People/Person/Name) od predykatu [1]:

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

W tym przykładzie została zmieniona kolejność stosowania predykatu.Jest to spowodowane tym, że jako pierwsza jest obliczana ścieżka ujęta w nawiasy (/People/Person/Name), a następnie do zestawu, który zawiera wszystkie węzły spełniające kryterium tej ścieżki, jest stosowany operator predykatu [1].Bez nawiasów kolejność działań byłaby o tyle inna, że [1] zostałby zastosowany jako test węzła child::Name, podobnie jak w pierwszym przykładowym wyrażeniu ścieżki.

Jeśli wartość określonego rejestru istnieje i zawiera wartość różną od zera, stan pola wyboru jest zaznaczone, w przeciwnym razie jest wyczyszczone.

Między nawiasami samego predykatu można używać wielokrotnie kwantyfikatorów i je dodawać.Poniżej jest przedstawiony zmodyfikowany poprzedni przykład, w którym w poprawny sposób użyto więcej niż jednego kwantyfikatora w wyrażeniu podrzędnie złożonym predykatu.

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

Wynik wyrażenia predykatu jest konwertowany na wartość logiczną i jest nazywany wartością prawdy predykatu.Tylko te węzły w sekwencji, których wartość prawdy predykatu wynosi True, są zwracane w wyniku.Wszystkie inne węzły są odrzucane.

Na przykład predykat jest zawarty w drugim kroku następującego wyrażenia ścieżki:

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

Warunek określony przez ten predykat jest stosowany do wszystkich obiektów podrzędnych węzła elementu <Location>.W wyniku są zwracane tylko te lokalizacje gniazd produkcyjnych, których wartość atrybutu LocationID wynosi 10.

Występuje, gdy tekst komunikatu wyjątek jest kopiowany z pola wiadomości do Schowka.

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

Obliczanie wartości prawdy predykatu

W takim przypadek wystąpi wyjątek i dzięki temu akcja, którą można zorganizować ręcznie do odpowiedniego wątek.

  1. Jeśli wartość wyrażenia predykatu jest pustą sekwencją, wartość prawdy predykatu wynosi False.

    Na przykład:

    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
    

    Wyrażenie ścieżki w tej kwerendzie zwraca tylko te węzły elementu <Location>, w których jest określony atrybut LotSize.Jeśli predykat zwraca pustą sekwencję dla określonego elementu <Location>, ta lokalizacja gniazda produkcyjnego nie jest zwracana w wyniku.

  2. Wartości predykatu mogą być tylko typu xs:integer, xs:Boolean lub node*.W przypadku typu node* wynik obliczania predykatu wynosi True, jeśli istnieją jakiekolwiek węzły, lub False, jeśli sekwencja jest pusta.Każdy inny typ liczbowy, jak podwójny i zmiennoprzecinkowy, generuje statyczny błąd typu.Wartość prawdy wyrażenia predykatu wynosi True wtedy i tylko wtedy, gdy wynikowa liczba całkowita jest równa wartości pozycji kontekstu.Ponadto tylko wartości literału i funkcja last() zmniejszają kardynalność filtrowanego wyrażenia kroku do 1.

    Na przykład następująca kwerenda pobiera trzeci element podrzędny węzła elementu <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
    

    Pierwszy przycisk jest przyciskiem domyślnym.

    • W trzecim kroku tego wyrażenia jest określone wyrażenie predykatu, którego wartość wynosi 3.Zatem wartość prawdy tego wyrażenia predykatu wynosi True tylko w przypadku węzłów, których pozycja kontekstu jest równa 3.

    • Błąd zapobiega występowaniu podczas wyświetlania w oknie komunikatu wyjątek w aplikacji wielowątkowych.Służy do identyfikacji przycisku, aby zamknąć okno komunikatu wyjątek, gdy używane są przyciski tekst niestandardowy kliknięty.

    • The query returns the third child element node of the <Features> element children of the <ProductDescription> element children of the document root.

  3. Drugi przycisk niestandardowy tekst.

    For example, the following query is specified against an xmltype variable that holds an XML instance, the customer survey XML instance.Czwarty przycisk niestandardowy tekst.In this query, that would be <HasChildren>1</HasChildren>.

    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
    

    Pierwszy przycisk jest przyciskiem domyślnym.

    • The expression in the for loop has two steps, and the second step specifies a predicate.Określa wyświetlane różne opcje w oknie komunikatu wyjątku.powinny być używane do wyświetlania komunikatów o błędach w niektórych językach czytania od prawej do lewej.

    • Kwerenda zwraca obiekty podrzędne elementu <Customer>, którego wartość predykatu wynosi True, z obiektów podrzędnych elementu <Survey> węzła głównego dokumentu.To jest wynik:

      <CustomerWithChildren CustomerID="1"/> 
      
  4. Wyświetl odczytywania tekstu od prawej do lewej.

For example, the following query retrieves ProductModelID for product models whose XML catalog description includes at least one feature, a child element of the <Features> element, from the namespace associated with the wm prefix.

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

Prolog XQuery jest serią deklaracji i definicje, które razem utworzyć wymaganego środowiska przetwarzania kwerendy.

W programie SQL Server prologu XQuery może zawierać deklaracje obszaru nazw.Integer literal values and the last() function reduce the cardinality of the filtered step expression to at most one.