비교 식(XQuery)
적용 대상:SQL Server
XQuery는 다음과 같은 유형의 비교 연산자를 제공합니다.
일반 비교 연산자
값 비교 연산자
노드 비교 연산자
노드 순서 비교 연산자
일반 비교 연산자
일반 비교 연산자를 사용하여 원자성 값, 시퀀스 또는 둘의 조합을 비교할 수 있습니다.
일반 연산자는 다음 표에 정의되어 있습니다.
Operator | 설명 |
---|---|
= | 같음 |
!= | 같지 않음 |
< | 보다 작음 |
> | 보다 큼 |
<= | 작거나 같음 |
>= | 크거나 같음 |
일반 비교 연산자를 사용하여 두 시퀀스를 비교하는 경우 두 번째 시퀀스에 True를 첫 번째 시퀀스의 값과 비교하는 값이 있으면 전체 결과는 True입니다. 그렇지 않으면 False입니다. 예를 들어 값 3이 두 시퀀스에 모두 표시되므로 (1, 2, 3) = (3, 4)는 True입니다.
declare @x xml
set @x=''
select @x.query('(1,2,3) = (3,4)')
비교에서는 값이 비슷한 형식일 것으로 예상합니다. 특히 정적으로 검사됩니다. 숫자 비교의 경우 숫자 유형 승격이 발생할 수 있습니다. 예를 들어 10의 10진수 값을 double 값 1e1과 비교하면 10진수 값이 double로 변경됩니다. 이중 비교는 정확할 수 없으므로 이 경우 결과가 정확하지 않을 수 있습니다.
값 중 하나가 형식화되지 않은 경우 다른 값의 유형으로 캐스팅됩니다. 다음 예제에서 값 7은 정수로 처리됩니다. 비교하기 전에 /a[1]의 형식화되지 않은 값이 정수로 변환됩니다. 정수 비교는 True를 반환합니다.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < 7')
반대로 형식화되지 않은 값을 문자열이나 형식화되지 않은 다른 값과 비교하면 xs:string으로 캐스팅됩니다. 다음 쿼리에서 문자열 6은 문자열 "17"에 비교됩니다. 다음 쿼리는 문자열 비교이므로 False를 반환합니다.
declare @x xml
set @x='<a>6</a>'
select @x.query('/a[1] < "17"')
다음 쿼리는 AdventureWorks 예제 데이터베이스에 제공된 제품 카탈로그의 제품 모델에 대한 크기가 작은 사진을 반환합니다. 쿼리는 싱글톤 시퀀스 "small"과 함께 반환된 PD:ProductDescription/PD:Picture/PD:Size
원자성 값 시퀀스를 비교합니다. 비교가 True이면 Picture> 요소를 반환합니다<.
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
다음 쿼리는 숫자> 요소의 전화 번호 시퀀스를 <문자열 리터럴 "112-111-1111"에 비교합니다. 이 쿼리는 AdditionalContactInfo 열의 전화 번호 요소 시퀀스를 비교하여 문서에 특정 고객의 특정 전화 번호가 있는지 확인합니다.
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
쿼리는 True를 반환합니다. 이는 문서에 숫자가 있음을 나타냅니다. 다음 쿼리는 이전 쿼리의 약간 수정된 버전입니다. 이 쿼리에서 문서에서 검색된 전화 번호 값은 두 개의 전화 번호 값 시퀀스에 비교됩니다. 비교가 True <이면 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
결과는 다음과 같습니다.
\<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 | 설명 |
---|---|
eq | 같음 |
ne | 같지 않음 |
lt | 보다 작음 |
gt | 보다 큼 |
le | 작거나 같음 |
ge | 크거나 같음 |
두 값이 선택한 연산자에 따라 동일한 값을 비교하면 식이 True를 반환합니다. 그렇지 않으면 False를 반환합니다. 한 값이 빈 시퀀스이면 식 결과는 False입니다.
이러한 연산자는 싱글톤 원자성 값에서만 작동합니다. 즉, 시퀀스를 피연산자 중 하나로 지정할 수 없습니다.
예를 들어 다음 쿼리는 그림> 크기가 "작음" 제품 모델에 대한 Picture 요소를 검색<합니다.
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
이전 쿼리의 다음 사항에 유의하세요.
declare namespace
는 이후에 쿼리에서 사용되는 네임스페이스 접두사를 정의합니다.<Size> 요소 값은 지정된 원자성 값인 "small"과 비교됩니다.
값 연산자는 원자성 값 에서만 작동하므로 data() 함수는 노드 값을 검색하는 데 암시적으로 사용됩니다. 즉
data($P/PD:Size) eq "small"
은 같은 결과를 생성합니다.
결과는 다음과 같습니다.
\<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>
값 비교에 대한 형식 승격 규칙은 일반 비교의 경우와 동일합니다. 또한 SQL Server는 일반 비교 중에 사용하는 것과 동일한 캐스팅 규칙을 값 비교 중에 형식화되지 않은 값에 사용합니다. 반면, XQuery 사양의 규칙은 항상 값을 비교하는 동안 형식화되지 않은 값을 xs:string로 캐스팅합니다.
노드 비교 연산자
노드 비교 연산 자는 노드 형식에만 적용됩니다. 반환되는 결과는 피연산자로 전달된 두 노드가 원본 문서에서 동일한 노드를 나타내는지 여부를 나타냅니다. 이 연산자는 두 피연산자가 같은 노드이면 True를 반환하고 그렇지 않으면 False를 반환합니다.
다음 쿼리는 업무 센터 위치 10이 특정 제품 모델의 제조 프로세스에서 첫 번째인지 여부를 확인합니다.
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
결과는 다음과 같습니다.
ProductModelID Result
-------------- --------------------------
7 <Result>equal</Result>
노드 순서 비교 연산자
노드 순서 비교 연산자는 문서에서 연산자의 위치를 기준으로 노드 쌍을 비교합니다.
다음은 문서 순서에 따라 수행되는 비교입니다.
<<
: 피연산자 1이 문서 순서에서 피연산자 2 앞에 오나요?>>
: 피연산자 1이 문서 순서에서 피연산자 2를 따릅니다.
다음 쿼리는 제품 카탈로그 설명에 <특정 제품의 문서 순서에서 Maintenance> 요소 앞에 <나타나는 보증> 요소가 있는 경우 True를 반환합니다.
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
이전 쿼리의 다음 사항에 유의하세요.
xml데이터 형식의 value() 메서드가 쿼리에 사용됩니다.
쿼리의 부울 결과는 nvarchar(10)로 변환되고 반환됩니다.
쿼리는 True를 반환합니다.