
✔️ Lv. 4
developers의 skill_code를 표현하는 방식을 bitmasking이라고 하는 걸로 기억한다.
비트를 통해 정보를 표현하는 방식이다.
이러한 방식은 어떻게 확인할 수 있는가?
바로 AND(&)연산이다.
정보 비트x와 와 확인하고 싶은 정보 비트y를 AND 연산하면 y가 있을 경우 y가 그대로 나오게 된다.
이러한 점을 이용하면 쉽게 쿼리를 작성할 수 있다.
일단 확인해야하는 정보에는 세가지가 있다.
Python 스킬을 가졌는지C# 스킬을 가졌는지Front End 스킬을 가졌는지위 둘은 그대로 Python과 C#을 추출해서 인라인에서 서브쿼리형식으로 사용해도 복잡하지 않지만, 모든 Front End 스킬을 추출하는 과정은 따로 분리하는 것이 좋겠다고 판단됐다.
CTE front_skill로 따로 빼주고, 모든 Front End 스킬의 code를 합산한 값을 갖도록 했다.
이렇게 하면 나중에 이 합산 값과 AND연산을 해서 0보다 클 경우 Front End 스킬을 가지고 있는 것으로 판단할 수 있다.
정보를 모두 추출할 수 있도록 확보했다면 이제 grade 컬럼을 만들어줘야 한다.
나중에 grade컬럼이 null이 아닌 값만 추출해야 하므로 이 또한 CTE로 만들어준다.
(SELECT는 WHERE보다 나중에 실행되기 때문)
grade 컬럼은 CASE문을 통해 아까 준비한 정보들을 확인하며 각각 A, B, C를 매겨준다.
ELSE는 안써도 무방하지만, 개인적으로는 조건에 포함되지 않는 경우 null으로 의도했다고 하더라도 ELSE를 작성하는것을 추천한다. (실수할 수 있기 때문)
이렇게 작성한 CTE는 set_grade라는 이름을 붙였다.
이제 set_grade로부터 grade가 null이 아닌 레코드를 추출하고, 필요한 컬럼만 추출한 뒤, 조건에 맞춰 정렬해주면 된다!
WITH front_skill AS (
SELECT SUM(code) code
FROM skillcodes
WHERE category = "Front End"
), set_grade AS (
SELECT *,
CASE
WHEN skill_code & (SELECT code FROM skillcodes WHERE name = "Python") = (SELECT code FROM skillcodes WHERE name = "Python")
AND skill_code & (SELECT code FROM front_skill) > 0
THEN "A"
WHEN skill_code & (SELECT code FROM skillcodes WHERE name = "C#") = (SELECT code FROM skillcodes WHERE name = "C#")
THEN "B"
WHEN skill_code & (SELECT code FROM front_skill) > 0
THEN "C"
ELSE NULL
END grade
FROM developers
)
SELECT grade, id, email
FROM set_grade
WHERE grade IS NOT NULL
ORDER BY 1, 2;
잠깐의 바쁜 기간을 지나 다시 돌아왔다.
그 기간동안 코딩이나 쿼리작성 등에는 손도 못대면서 공부랑 이력서 자소서 등만 작성했는데...
하면서도 내내 돌아가면 코딩 어떻게 하는지 다 까먹는거 아닌가 하는 생각에 앞이 캄캄했다.
근데 다행히도 이번 SQL 문제는 첫번째 시도에 맞추긴 했다.
복습이긴 하지만... ^^
다행.. 이지만 Python은 상당히 불안하다.
당장 프로젝트 다시 재개하려는 것만 봐도 Django가 상당부분 기억이 흐려졌다.
공부는 역시 꾸준함이 생명인듯 하다.
이왕 이렇게 된거 코딩만 업로드할게 아니라 CS 공부도 정리해서 벨로그에 업로드해야겠다.