[SQL문제풀기] 특정 형질을 가지는 대장균 찾기

silver's avatar
Dec 02, 2024
[SQL문제풀기] 특정 형질을 가지는 대장균 찾기
 

문제

 

내가 작성한 답

 
  1. 처음에 작성한 틀린 답 - 자리 이하의 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;
 
  1. 두 번째로 작성한 틀린 답 - 자리수가 부족할 경우를 대비하여 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);
 
  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');
 
  1. MYSQL의 비트연산자 공부 후 작성한 답
💡
SQL에서 비트 연산자는 숫자를 2진수로 자동 변환하여 연산을 수행하기 때문에 숫자를 직접 2진수로 변환할 필요 없이 비트 연산을 사용가능하다
A & 2^n = 2^n 을 해주면, A를 2진수로 변환했을 때 n+1번째 자리가 1인지 여부를 파악할 수 있다.
notion image
  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 ));
  1. 정답
SELECT COUNT(DISTINCT ID) COUNT FROM ECOLI_DATA ㄴWHERE (GENOTYPE & 2 = 0) AND ((GENOTYPE & 1 > 0) OR (GENOTYPE & 4 > 0));
Share article

silver