2009-03-21 8 views
27

매우 기본적인 질문은 죄송합니다. 무엇 & 연산자를하는 일은이 SQLSQL 서버의 앰퍼샌드 (&) 연산자 WHERE 절

WHERE (sc.Attributes & 1) = 0 

sc에서 할 것은 열 attributes을 포함하는 테이블의 별칭입니다.

보고서의 일부 SQL을 이해하려고하는데 그 행에서 0 항목을 반환합니다. 만약 내가 그것을 주석으로 작동합니다. SQL 지식이 제한되어 있고 & 1이 무엇을하고 있는지 잘 모르겠습니다.

답변

44

& is the bitwise logical and operator - 2 개의 정수 값에 대해 연산을 수행합니다.

WHERE (sc.Attributes & 1) = 0 

위의 코드는 sc.Attributes가 짝수인지 확인합니다. 첫 번째 비트가 설정되지 않았다는 것과 같은 말입니다.

열의 이름 때문에 "특성"인 경우 "1"값은 일부 외부 의미가있는 플래그 일뿐입니다.

속성에 대해 숫자에 저장된 각 플래그에 대해 1 진수를 사용하는 것이 일반적입니다. 따라서 첫 번째 비트를 테스트하려면 sc.Attributes & 1을 사용하고 두 번째 테스트에서는 sc.Attributes & 2를 사용하고 세 번째 테스트에서는 sc.Attributes & 4를 사용하여 sc를 사용합니다. 속성 & 8, ...

= 0 부분은 첫 번째 비트가 설정되어 있지 않은지 확인하기 위해 테스트 중입니다.

일부 바이너리 예

: (== 연산의 결과 보여주기 위해)

//Check if the first bit is set, same as sc.Attributes&1 
11111111 & 00000001 == 1 
11111110 & 00000001 == 0 
00000001 & 00000001 == 1 


//Check if the third bit is set, same as sc.Attributes&4 
11111111 & 00000100 == 1 
11111011 & 00000100 == 0 
00000100 & 00000100 == 1 
+1

+1 아주 잘 설명했다. –

+1

@Andrew Hare : 고마워. :) –

+0

고마워. 그런 간단한 질문에 사과드립니다. 우수한 답변과 시간을 가져 주셔서 감사합니다. – Jimmymcnulty

1

이 같은 SQL 서버를 태그로보고를, 나는 또한 우연히 나는 다른 각도에서 뭔가를 추가 할 줄 알았는데 이번 주 중 하나.

이렇게하면 술어에 사용되는 쿼리의 성능이 저하 될 수 있습니다. 자신의 예를 아주 쉽게 제조 할 수 있습니다. 여기에 단순히이 책갈피 조회를 제거하기 위해 최적화를 허용 및 성능 통계는 X10의 성능 향상을 보였다 적절한 값으로 각 열을 정의하여 내 쿼리

WHERE 
advertiserid = @advertiserid 
AND (is_deleted & @dirty > 0) 

WHERE 
advertiserid = @advertiserid 
AND (is_deleted > 0 AND @dirty > 0) 

의 조각입니다.

+0

열의 모든 수학 연산이 적합하지 않습니다. 수학 만이 아닙니다. – SpaceGhost440