2011-03-31 2 views
1

내가이 말 일부 도움이 필요하십니까 :SQL 서버 비트 논리 작업 - 다음

Declare @LineA int 
Declare @LineB int 
Declare @LineC int 
Declare @LineD int 
Declare @LineRequested int 
Declare @LineTaken int 

Set @LineA = 1 
Set @LineB = 2 
Set @LineC = 4 
Set @LineD = 8 

Set @LineRequested = 11 -- @LineA | @LineB | @LineD 

Set @LineTaken = 2 -- Matches a line in @LineRequested (@LineB) 
Set @LineTaken = 4 -- Does not match (Line C was not one of the lines OR'd) 

어떻게 @LineTaken의 값이 @LineRequested의 값의 ONE를가 있는지 확인하기 위해 테스트 할 수 있습니다? 위의 예에서 @LineTaken = 2 일 때 값 중 하나와 일치합니다 (@LineA | @LineB). 그러나 두 번째에서는 그렇지 않습니다. 이것을 어떻게 프로그램 적으로 결정할 수 있습니까?

+0

되어'@의 LineTaken'? 당신은 항상 한 줄을 찾고 있습니까? '@ LineTaken'이 예를 들어 5 일 때 어떤 일이 일어나지 않을까요? ** ** 1과 4가 모두 일치하거나 둘 중 하나가 일치하면 일치하는 것이 좋습니다. –

답변

2
SELECT CASE WHEN @LineRequested | 2 = @LineRequested THEN 'Y' ELSE 'N' END, 
     CASE WHEN @LineRequested | 4 = @LineRequested THEN 'Y' ELSE 'N' END 
+0

@Dumitrescu, 그것에 대해 땀을 내지 마십시오. 그것은 나를 속일 것입니다. 나는 당신의 코멘트 때문에 더 가까이서 만 보았다. * 두 솔루션 모두 +1 btw, afaik, 그들은 모두 나에게 맞는 것 같습니다 * –

+0

완벽, 고마워. –

+0

@Lieven -'@ LineTaken'의 정확한 제곱수가 아닌 경우에는 다릅니다.'@ LineTaken'에 설정된 모든 비트가'@ LineRequested'에도 설정된 경우에만 내 대답은'Y'를 반환합니다. 적어도 하나의 비트가 일치하면 Dumitrescu의 대답. 그것은 굵은 글씨 **에서 요구되는 것일 수 있습니다. 그러나 ** 주어진 예제는이 점을 분명히하지 않습니다 ... –

2

시도 : 2의 항상 전원

SELECT CASE WHEN @LineRequested & @LineTaken > 0 THEN 'Y' ELSE 'N' END