
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
| Column name | Type | Nullable |
|---|---|---|
| ID | INTEGER | FALSE |
| PARENT_ID | INTEGER | TRUE |
| SIZE_OF_COLONY | INTEGER | FALSE |
| DIFFERENTIATION_DATE | DATE | FALSE |
| GENOTYPE | INTEGER | FALSE |
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
이 문제를 처음 접했을 때 BIN() 함수를 사용하여 이진수로 나타낸 형질을 4비트 내에서 만들 수 있는 모든 조합을 만들어 IN 연산을 수행하려 했지만 실패했다.
그 이유는 문제에서 형질을 이진수로 변환할 시 최대 4비트까지 표현된다는 제한이 없었고, 따라서 5, 6 비트를 넘어가는 형질을 지닌 대장균이 있을 수 있기 때문이다.
따라서 포함하지 않아야하는 2번 형질(2번 비트)와 포함해야하는 1, 3번 형질(1, 3번 비트)만을 비교해야한다.
따라서 아래와 같이 &를 사용한 비트 연산을 통해 2(10)와 AND 연산시 0이되고, 1(1)또는 4(100)와 AND 연산시 0이 되지 않는 (1번과 3번 형질이 1인) 데이터만을 추출하여 개수를 세어주면 된다.
WHERE (GENOTYPE & 2) = 0
AND ((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0);
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2) = 0
AND ((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0);
SQL에서도 비트 연산을 수행할 수 있다는 것을 배울 수 있었다.
https://school.programmers.co.kr/learn/courses/30/lessons/301646