Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Funkcja XQuery udostępnia następujące typy operatorów porównania:
Ogólne operatory porównania
Operatory porównania wartości
Operatory porównania węzłów
Operatory porównania kolejności węzłów
Ogólne operatory porównania
Ogólne operatory porównania mogą służyć do porównywania wartości niepodzielnych, sekwencji lub dowolnej kombinacji tych dwóch.
Operatory ogólne są zdefiniowane w poniższej tabeli.
| Obsługujący | Opis |
|---|---|
| = | Równe |
| != | Nierówne |
| < | Mniejsze niż |
| > | Większe niż |
| <= | Mniej lub równe |
| >= | Większe niż lub równe |
Podczas porównywania dwóch sekwencji przy użyciu operatorów porównania ogólnego i wartość istnieje w drugiej sekwencji, która porównuje wartość True z wartością w pierwszej sekwencji, ogólny wynik to True. W przeciwnym razie jest to Fałsz. Na przykład (1, 2, 3) = (3, 4) ma wartość True, ponieważ wartość 3 jest wyświetlana w obu sekwencjach.
declare @x xml
set @x=''
select @x.query('(1,2,3) = (3,4)')
Porównanie oczekuje, że wartości są porównywalne typy. W szczególności są one statycznie sprawdzane. W przypadku porównań liczbowych może wystąpić podwyższenie poziomu typu liczbowego. Jeśli na przykład wartość dziesiętna 10 jest porównywana z podwójną wartością 1e1, wartość dziesiętna zostanie zmieniona na dwukrotnie. Należy pamiętać, że może to spowodować utworzenie wyników niewykonanych, ponieważ podwójne porównania nie mogą być dokładne.
Jeśli jedna z wartości jest nietypowa, jest rzutowana na typ innej wartości. W poniższym przykładzie wartość 7 jest traktowana jako liczba całkowita. Przed porównaniem nietypowa wartość /a[1] jest konwertowana na liczbę całkowitą. Porównanie liczb całkowitych zwraca wartość True.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < 7')
Z drugiej strony, jeśli nietypowa wartość jest porównywana z ciągiem lub inną nietypową wartością, zostanie ona rzutowana na ciąg xs:string. W poniższym zapytaniu ciąg 6 jest porównywany z ciągiem "17". Poniższe zapytanie zwraca wartość False ze względu na porównanie ciągów.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < "17"')
Poniższe zapytanie zwraca małe obrazy modelu produktu z katalogu produktów udostępnionego w przykładowej bazie danych AdventureWorks. Zapytanie porównuje sekwencję wartości niepodzielnych zwracanych przez PD:ProductDescription/PD:Picture/PD:Size pojedynczą sekwencję "małą". Jeśli porównanie ma wartość True, zwraca <element Obraz> .
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
Poniższe zapytanie porównuje sekwencję numerów telefonów w <elementach liczbowych> z literałem ciągu "112-111-1111". Zapytanie porównuje sekwencję elementów numeru telefonu w kolumnie AdditionalContactInfo, aby określić, czy w dokumencie istnieje określony numer telefonu dla określonego klienta.
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
Zapytanie zwraca wartość True. Oznacza to, że liczba istnieje w dokumencie. Poniższe zapytanie jest nieco zmodyfikowaną wersją poprzedniego zapytania. W tym zapytaniu wartości numeru telefonu pobrane z dokumentu są porównywane z sekwencją dwóch wartości numeru telefonu. Jeśli porównanie ma wartość True, <zwracany jest element number> .
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
Jest to wynik:
\<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>
Operatory porównania wartości
Operatory porównania wartości służą do porównywania wartości niepodzielnych. Należy pamiętać, że w zapytaniach można używać operatorów porównania ogólnego zamiast operatorów porównania wartości.
Operatory porównania wartości są zdefiniowane w poniższej tabeli.
| Obsługujący | Opis |
|---|---|
| Eq | Równe |
| Ne | Nierówne |
| Lt | Mniejsze niż |
| Gt | Większe niż |
| Le | Mniej lub równe |
| Ge | Większe niż lub równe |
Jeśli dwie wartości porównają to samo zgodnie z wybranym operatorem, wyrażenie zwróci wartość True. W przeciwnym razie zwróci wartość False. Jeśli którakolwiek z wartości jest pustą sekwencją, wynik wyrażenia to False.
Te operatory działają tylko na pojedynczych wartościach niepodzielnych. Oznacza to, że nie można określić sekwencji jako jednego z operandów.
Na przykład następujące zapytanie pobiera <elementy obrazów> dla modelu produktu, w którym rozmiar obrazu jest "mały:
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
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
declare namespacedefiniuje prefiks przestrzeni nazw, który jest następnie używany w zapytaniu.Wartość elementu Size< jest porównywana >z określoną wartością atomową "small".
Należy pamiętać, że ponieważ operatory wartości działają tylko na wartościach niepodzielnych, funkcja data() jest niejawnie używana do pobierania wartości węzła. Oznacza to,
data($P/PD:Size) eq "small"że daje ten sam wynik.
Jest to wynik:
\<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>
Należy pamiętać, że reguły podwyższania poziomu typów dla porównań wartości są takie same jak w przypadku porównań ogólnych. Ponadto program SQL Server używa tych samych reguł rzutu dla nietypowych wartości podczas porównań wartości, które są używane podczas porównań ogólnych. Z kolei reguły w specyfikacji XQuery zawsze rzutować nietypową wartość na xs:string podczas porównań wartości.
Operator porównania węzłów
Operator porównania węzłów ma zastosowanie tylko do typów węzłów. Zwracany wynik wskazuje, czy dwa węzły przekazywane jako operandy reprezentują ten sam węzeł w dokumencie źródłowym. Ten operator zwraca wartość True, jeśli dwa operandy są tym samym węzłem. W przeciwnym razie zwraca wartość False.
Poniższe zapytanie sprawdza, czy lokalizacja centrum pracy 10 jest pierwszą w procesie produkcji określonego modelu produktu.
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
Jest to wynik:
ProductModelID Result
-------------- --------------------------
7 <Result>equal</Result>
Operatory porównania kolejności węzłów
Operatory porównania kolejności węzłów porównują pary węzłów na podstawie ich pozycji w dokumencie.
Są to porównania, które są wykonywane w oparciu o kolejność dokumentów:
<<: czy operand 1 poprzedza operand 2 w kolejności dokumentu.>>: Czy operand 1 następuje po operand 2 w kolejności dokumentu.
Poniższe zapytanie zwraca wartość True, jeśli opis wykazu produktów zawiera <element Gwarancja> wyświetlany przed elementem <Konserwacji> w kolejności dokumentu dla określonego produktu.
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
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
Metoda value() typu danych XML jest używana w zapytaniu.
Wynik logiczny zapytania jest konwertowany na nvarchar(10) i zwracany.
Zapytanie zwraca wartość True.
Zobacz też
system typów (XQuery)
wyrażenia XQuery