Bagikan melalui


Ekspresi Perbandingan (XQuery)

Berlaku untuk:SQL Server

XQuery menyediakan jenis operator perbandingan berikut:

  • Operator perbandingan umum

  • Operator perbandingan nilai

  • Operator perbandingan simpul

  • Operator perbandingan pesanan simpul

Operator Perbandingan Umum

Operator perbandingan umum dapat digunakan untuk membandingkan nilai atom, urutan, atau kombinasi apa pun dari keduanya.

Operator umum ditentukan dalam tabel berikut.

Operator Deskripsi
= Equal
!= Tidak sama dengan
< Less than
> Lebih besar dari
<= Kurang dari atau sama dengan
>= Lebih dari atau sama dengan

Saat Anda membandingkan dua urutan dengan menggunakan operator perbandingan umum dan nilai ada di urutan kedua yang membandingkan True dengan nilai dalam urutan pertama, hasil keseluruhan adalah True. Jika tidak, itu adalah False. Misalnya, (1, 2, 3) = (3, 4) adalah True, karena nilai 3 muncul di kedua urutan.

declare @x xml  
set @x=''  
select @x.query('(1,2,3) = (3,4)')    

Perbandingan mengharapkan bahwa nilainya adalah jenis yang sebanding. Secara khusus, mereka diperiksa secara statis. Untuk perbandingan numerik, promosi jenis numerik dapat terjadi. Misalnya, jika nilai desimal 10 dibandingkan dengan nilai ganda 1e1, nilai desimal diubah menjadi dua kali lipat. Perhatikan bahwa ini dapat membuat hasil yang tidak tepat, karena perbandingan ganda tidak dapat tepat.

Jika salah satu nilai tidak diketik, nilai tersebut akan dilemparkan ke jenis nilai lainnya. Dalam contoh berikut, nilai 7 diperlakukan sebagai bilangan bulat. Sebelum dibandingkan, nilai yang tidak dititip dari /a[1] dikonversi menjadi bilangan bulat. Perbandingan bilangan bulat mengembalikan True.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < 7')  

Sebaliknya, jika nilai yang tidak diketik dibandingkan dengan string atau nilai lain yang tidak diketik, nilai tersebut akan ditransmisikan ke xs:string. Dalam kueri berikut, string 6 dibandingkan dengan string "17". Kueri berikut mengembalikan False, karena perbandingan string.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < "17"')  

Kueri berikut mengembalikan gambar ukuran kecil model produk dari katalog produk yang disediakan dalam database sampel AdventureWorks. Kueri membandingkan urutan nilai atom yang dikembalikan dengan PD:ProductDescription/PD:Picture/PD:Size urutan singleton, "kecil". Jika perbandingannya True, maka akan mengembalikan <elemen Gambar> .

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         

Kueri berikut membandingkan urutan nomor telepon dalam <elemen angka> dengan string literal "112-111-1111". Kueri membandingkan urutan elemen nomor telepon di kolom AdditionalContactInfo untuk menentukan apakah nomor telepon tertentu untuk pelanggan tertentu ada dalam dokumen.

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         

Kueri mengembalikan True. Ini menunjukkan bahwa angka ada dalam dokumen. Kueri berikut adalah versi kueri sebelumnya yang sedikit dimodifikasi. Dalam kueri ini, nilai nomor telepon yang diambil dari dokumen dibandingkan dengan urutan dua nilai nomor telepon. Jika perbandingan adalah True, <elemen angka> dikembalikan.

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  
  

Ini adalah hasilnya:

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

Operator Perbandingan Nilai

Operator perbandingan nilai digunakan untuk membandingkan nilai atomik. Perhatikan bahwa Anda dapat menggunakan operator perbandingan umum alih-alih operator perbandingan nilai dalam kueri Anda.

Operator perbandingan nilai ditentukan dalam tabel berikut.

Operator Deskripsi
eq Equal
ne Tidak sama dengan
lt Less than
gt Lebih besar dari
le Kurang dari atau sama dengan
ge Lebih dari atau sama dengan

Jika dua nilai membandingkan yang sama sesuai dengan operator yang dipilih, ekspresi akan mengembalikan True. Jika tidak, itu akan mengembalikan False. Jika salah satu nilai adalah urutan kosong, hasil ekspresinya adalah False.

Operator ini hanya bekerja pada nilai atom singleton. Artinya, Anda tidak dapat menentukan urutan sebagai salah satu operand.

Misalnya, kueri berikut mengambil <elemen Gambar> untuk model produk di mana ukuran gambar "kecil:

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         

Perhatikan hal berikut ini dari kueri sebelumnya:

  • declare namespace menentukan awalan namespace yang kemudian digunakan dalam kueri.

  • Nilai <elemen Ukuran> dibandingkan dengan nilai atom yang ditentukan, "kecil".

  • Perhatikan bahwa karena operator nilai hanya bekerja pada nilai atomik, fungsi data() secara implisit digunakan untuk mengambil nilai simpul. Artinya, data($P/PD:Size) eq "small" menghasilkan hasil yang sama.

Ini adalah hasilnya:

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

Perhatikan bahwa aturan promosi jenis untuk perbandingan nilai sama dengan untuk perbandingan umum. Selain itu, SQL Server menggunakan aturan transmisi yang sama untuk nilai yang tidak diketik selama perbandingan nilai seperti yang digunakan selama perbandingan umum. Sebaliknya, aturan dalam spesifikasi XQuery selalu mentransmisikan nilai yang tidak diketik ke xs:string selama perbandingan nilai.

Operator Perbandingan Simpul

Operator perbandingan simpul, adalah, hanya berlaku untuk jenis node. Hasil yang dikembalikan menunjukkan apakah dua simpul yang diteruskan sebagai operand mewakili simpul yang sama dalam dokumen sumber. Operator ini mengembalikan True jika kedua operand adalah node yang sama. Jika tidak, ia mengembalikan False.

Kueri berikut memeriksa apakah lokasi pusat kerja 10 adalah yang pertama dalam proses manufaktur model produk tertentu.

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           

Ini adalah hasilnya:

ProductModelID       Result          
-------------- --------------------------  
7              <Result>equal</Result>      

Operator Perbandingan Pesanan Simpul

Operator perbandingan urutan simpul membandingkan pasangan simpul, berdasarkan posisinya dalam dokumen.

Ini adalah perbandingan yang dibuat, berdasarkan urutan dokumen:

  • << : Apakah operand 1 mendahului operand 2 dalam urutan dokumen.

  • >> : Apakah operand 1 mengikuti operand 2 dalam urutan dokumen.

Kueri berikut mengembalikan True jika deskripsi katalog produk memiliki <elemen Garansi> muncul sebelum <elemen Pemeliharaan> dalam urutan dokumen untuk produk tertentu.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Metode value() dari tipe data xmldigunakan dalam kueri.

  • Hasil Boolean dari kueri dikonversi ke nvarchar(10) dan dikembalikan.

  • Kueri mengembalikan True.

Lihat Juga

Sistem Jenis (XQuery)
Ekspresi XQuery