비트 단위 집계 함수
비트 단위 집계 함수는 정수 값으로 변환하거나 반올림할 수 있는 정수 열과 열의 집계를 수행하기 위해 비트 연산을 계산합니다.
비트 단위 집계 시 NULL 사용
NULL 값을 허용하는 열에 비트 단위 함수를 적용하면 함수 결과를 계산하기 전에 모든 NULL 값이 제거됩니다. 집계가 가능한 행이 없을 경우에는 비트 단위 함수가 NULL을 반환합니다. 정규 집계 함수에도 동일한 방식이 적용됩니다. 다음은 한 예입니다.
select sum(venueseats), bit_and(venueseats) from venue where venueseats is null; sum | bit_and ------+--------- null | null (1 row)
비트 단위 집계를 위한 DISTINCT 지원
다른 집계 함수와 마찬가지로 비트 단위 함수도 DISTINCT 키워드를 지원합니다.
하지만 이 함수에 DISTINCT를 사용하더라도 결과에는 아무런 영향도 미치지 않습니다. 값의 첫 번째 인스턴스는 비트 단위 AND 또는 OR 연산을 충족하기에 충분합니다. 평가 중인 표현식에 중복 값이 있는 경우에는 차이가 없습니다.
오히려 DISTINCT 처리 시 쿼리 실행에 따른 일부 오버헤드가 발생할 가능성이 많기 때문에 비트 단위 함수에서는 DISTINCT를 사용하지 않는 것이 좋습니다.
비트 단위 함수의 개요 예
다음에서 비트 단위 함수로 작업하는 방법을 보여주는 몇 가지 개요 예를 찾을 수 있습니다. 각 함수 설명과 함께 특정 코드 예제를 찾을 수도 있습니다.
비트 단위 함수의 예는 TICKIT 샘플 데이터베이스를 기반으로 합니다. TICKIT 샘플 데이터베이스의 USERS 테이블에는 스포츠, 영화, 오페라 등 다양한 이벤트 유형에 대한 각 사용자의 호불호를 나타내는 몇 가지 부울 열이 포함되어 있습니다. 예를 들면 다음과 같습니다.
select userid, username, lastname, city, state, likesports, liketheatre from users limit 10; userid | username | lastname | city | state | likesports | liketheatre -------+----------+-----------+--------------+-------+------------+------------- 1 | JSG99FHE | Taylor | Kent | WA | t | t 9 | MSD36KVR | Watkins | Port Orford | MD | t | f
USERS 테이블의 새 버전이 다른 방식으로 빌드되었다고 가정합니다. 이 새 버전에서는 각 사용자가 좋아하거나 좋아하지 않는 8가지 유형의 이벤트를 이진 형식으로 정의하는 단일 정수 열입니다. 이 설계에서 각 비트 위치는 이벤트 유형을 나타냅니다. 8가지 유형을 모두 좋아하는 사용자는 다음 표의 첫 번째 행과 같이 8개 비트 모두 1로 설정합니다. 반대로 이벤트를 모두 좋아하지 않는 사용자는 두 번째 행과 같이 8개 비트가 모두 0으로 설정됩니다. 그리고 스포츠와 재즈만 좋아하는 사용자는 세 번째 행과 같이 표현됩니다.
USER | 스포츠 | 영화 | 재즈 | 오페라 | 록 | 라스베이거스 | 브로드웨이 | 클래식 |
---|---|---|---|---|---|---|---|---|
사용자 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
데이터베이스 테이블에서는 이러한 이진 값들 모두 다음과 같이 LIKES 열 하나에 정수로 저장됩니다.
User | 이진 값 | 저장 값(정수) |
---|---|---|
사용자 1 | 11111111 | 255 |
255 | 00000000 | 0 |
0 | 10100000 | 160 |