1

int 값이있는 테이블이 있습니다 (각 비트는 플래그입니다).이진수와 합계 비트 필드 값

이제

나는 (내 경우 또는) 이항 연산로 집계 싶습니다 그래서 :

SELECT 1 AS bitfield 
INTO #TABLE 
UNION ALL SELECT 1 + 2 + 8 + 32 
UNION ALL SELECT 2 + 128 
UNION ALL SELECT 2 + 32 

SELECT AND_AGGR(bitfield) -- Invalid because AND_AGGR doesn't exist 
FROM #TABLE 

DROP #TABLE 

의 값이 초래 171

이 작업을 수행 할 수있는 좋은 방법이 될 것입니다 무엇 그 희망을 많이하지 않아도 |MAX (하지만 꼭해야하는 경우)?

저는 MS SQL Server 2008을 직접 사용하고 있지만 다른 서버의 솔루션도 중요합니다.

+1

"지금은 이진 연산으로 집계하고 싶습니다. (내 경우 AND)"AND "가 아닌"OR "가 확실합니까? –

+0

물론 그렇습니다. 나는 그것을 바꿀 것이다. 그것을 지적 해 주셔서 감사합니다 :) – ANisus

답변

1

당신이 결과 171를 기대하는 경우는, 반드시 바이너리 OR하지 AND 의미? 어떤 경우

,이 솔루션은 변수에 값을 집계 : 당신이 그룹에 다른 필드로 집계를하려는 경우 귀하의 요구 사항을 충족하지 않을 수 있습니다

SELECT 1 AS bitfield 
INTO #TABLE 
UNION ALL SELECT 1 + 2 + 8 + 32 
UNION ALL SELECT 2 + 128 
UNION ALL SELECT 2 + 32 

DECLARE @i int = 0 

SELECT @i = @i | bitfield 
FROM #TABLE 

SELECT @i 

DROP TABLE #table 

.

대형 테이블에서도 성능이 좋지 않을 수 있습니다.

+0

필자는이 솔루션을 사용할 수 있습니다. 실제 사례에서 다른 필드로 그룹화하고 싶지만 Mark Byers가 제공 한 MAX (bitfield | 1) + ... 솔루션이이 경우 작동한다고 가정합니다. – ANisus

2

MySQL 및 PostgreSQL에서는 BIT_OR을 사용할 수 있습니다.

SQL Server에이 집계 함수가 있다고 생각하지 않습니다.

당신은 MAX의 많은 그것을 할 수와 같은 &는 말했다 :

MAX(x & 1) + MAX(x & 2) + ... + MAX(x & 128) 
+0

답변 주셔서 감사합니다! 아,이 경우에는 잘못된 데이터베이스 솔루션을 사용하기 만하면됩니다. 그러나 그것이 나의 의심을 증명하는 것을 도왔던 것에 대한 대답에 감사드립니다. – ANisus