문제
내가 작성한 답
- 처음에 작성한 틀린 답 - 자리 이하의 2진수로 변환되면, 자리수가 부족해 원하는 위치에서 SUBSTRING이 잘못 동작할 수 있다.
SELECT COUNT(DISTINCT ID) COUNT
FROM ECOLI_DATA
WHERE (SUBSTRING(CONV(GENOTYPE,10,2),1,1) = 1
OR SUBSTRING(CONV(GENOTYPE,10,2),3,1) = 1)
AND SUBSTRING(CONV(GENOTYPE,10,2),2,1) = 0;
- 두 번째로 작성한 틀린 답 - 자리수가 부족할 경우를 대비하여 LPAD로 왼쪽에 0을 넣어 보정을 하였으나 LPAD에는 숫자도 ‘ ’안에 넣어야한다! → 출력값이 문자열이 된다. (하지만 쿼리가 실행은 됐는데 출력값의 오류!)
SELECT COUNT(DISTINCT ID) COUNT
FROM ECOLI_DATA
WHERE SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, 0), 2, 1) = 0
AND ( SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, 0), 1, 1) = 1
OR SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, 0), 3, 1) = 1);
- 세 번째 작성한 틀린 답 - 문자열로 출력될 것을 생각하여 결과값을 따옴표 안에 넣었으나 결과값이 오류가 남 : 원인을 아직 찾지 못함,,,,
SELECT COUNT(DISTINCT ID) COUNT
FROM ECOLI_DATA
WHERE SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, '0'), 2, 1) = '0'
AND ( SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, '0'), 1, 1) = '1'
OR SUBSTRING(LPAD(CONV(GENOTYPE, 10, 2), 4, '0'), 3, 1) = '1');
- MYSQL의 비트연산자 공부 후 작성한 답
SQL에서 비트 연산자는 숫자를 2진수로 자동 변환하여 연산을 수행하기 때문에 숫자를 직접 2진수로 변환할 필요 없이 비트 연산을 사용가능하다
A & 2^n = 2^n 을 해주면, A를 2진수로 변환했을 때 n+1번째 자리가 1인지 여부를 파악할 수 있다.

- 틀린 답 : 이 쿼리는 2번 형질이 없고, 1번 형질이 정확히 1인 경우 또는 3번 형질이 정확히 1인 경우만을 찾는다. 비트 연산에서 GENOTYPE & 1 = 1은 1번 형질이 존재하고 다른 형질이 없을 때만 참이 되기 때문에 1과 3 모두를 갖는 경우는 제외되기 때문에 오답
SELECT COUNT(DISTINCT ID) COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2 = 0)
AND
((GENOTYPE & 1 = 1) OR (GENOTYPE & 4 = 1 ));
- 정답
SELECT COUNT(DISTINCT ID) COUNT
FROM ECOLI_DATA
ㄴWHERE (GENOTYPE & 2 = 0)
AND
((GENOTYPE & 1 > 0) OR (GENOTYPE & 4 > 0));
Share article