문제 링크
난이도 : Lv. 1

문제 내용

문제 설명

대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.

다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며,  IDPARENT_IDSIZE_OF_COLONYDIFFERENTIATION_DATEGENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.

Column nameTypeNullable
IDINTEGERFALSE
PARENT_IDINTEGERTRUE
SIZE_OF_COLONYINTEGERFALSE
DIFFERENTIATION_DATEDATEFALSE
GENOTYPEINTEGERFALSE

최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.


문제

2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.

문제 분석

비트연산을 하는게 좋을 듯 해서 찾아봄

이번 문제는 mysql 만 지원해서, oracle 버전의 답안 작성 방법도 찾아봤음

작성한 코드

select count(id) as count
from ecoli_data
where (~genotype & b'0010') != 0
and (genotype & b'0100' != 0 or genotype & b'0001' != 0);

오라클 버전 (답 아닐수도 있음)

select count(id) as count
from ecoli_data
where bitand(bitnot(genotype), 2) != 0
and (bitand(genotype, 4) != 0 or bitand(genotype, 1) != 0);