SELECT
CASE
WHEN
BIT_OR(category = "Front End") AND BIT_OR(S.name = "Python")
THEN "A"
WHEN
BIT_OR(S.name = "C#")
THEN "B"
WHEN
BIT_OR(category = "Front End")
THEN "C"
ELSE NULL
END AS grade,
id,
email
FROM developers AS D
JOIN skillcodes AS S
ON (D.skill_code & S.code) = S.code
GROUP BY id, email
HAVING grade IS NOT NULL
ORDER BY grade, id
혹시 여기서 GROUP BY를 써야만 하는 이유를 알 수 있을까요?
그리고 BIT_OR 함수를 CATEGORY와 같은 문자열에 쓸 수 있는 이유도 알 수 있을까요?
join을 하게 되면 지금 developers * 각자의 skillcode 개수 만큼의 record가 남아있는 거거든요? 근데 최종결과는 각 개발자 마다 하나씩만 나올 거니까 group by를 씁니다. 또 그렇게 해야 모든 skill을 고려할 수 있어서 조건체크가 가능하기도 하구요
BIT_OR은 지금 문자열에 쓴 게 아니라 ex) category = "Front End" 문자열과 문자열을 비교한 boolean 결과에 사용한 것이라 그렇습니다! BIT_OR이 aggregation 함수라서 쉽게 말하면 skill code중에 "아무거나 front end가 하나라도 있으면"을 검사하게 되는 거죠