[SQL] SQL의 비트 연산
언어별 개발자 분류하기 문제 관련
(s.CODE & d.SKILL_CODE) > 0
(s.CODE & d.SKILL_CODE) > 0 이 조건은 이 개발자가 s.CODE 스킬을 보유하고 있는지만 판별한다.
스킬 코드 테이블이 아래와 같다고 하자
- C# 256
- Python 1024
개발자 d.SKILL_CODE = 1280 → 256 + 1024 (즉, FrontEnd + Python 보유)
연산결과
- 1280 & 256 = 256 (>0) → C# 있음
- 1280 & 1024 = 1024 (>0) → Python 있음
즉,
- 0 > → 해당 스킬 있음
- =0 → 해당 스킬 없음
그리고 어떤 스킬을 가졌는지는 JOIN 결과의 s.NAME 컬럼을 보면 알 수 있다.
즉, JOIN SKILLCODES s ON d.SKILL_CODE & s.CODE > 0 를 하면 개발자가 가진 스킬별로 여러 행이 생기고, 그 행에서 s.NAME 을 보면 어떤 스킬인지 구분 가능하다.
정리하면:
- 0 > 0 자체는 보유 여부 판정
- 어떤 스킬인지는 s.NAME, s.CATEGORY 컬럼 같이 봐야 함
비트연산으로 특정 스킬만 체크하는 방법
1. 특정 스킬 보유 여부 확인 (Python)
SELECT d.ID,
d.EMAIL,
CASE WHEN (d.SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python')) > 0
THEN 'Y'
ELSE 'N'
END AS HAS_PYTHON
FROM DEVELOPERS d;
2. 여러 스킬 동시에 체크 (Python + Front End)
SELECT d.ID,
d.EMAIL,
CASE WHEN (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0
AND (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0
THEN 'A'
ELSE 'X'
END AS RESULT
FROM DEVELOPERS d;
Python 과 Front End 둘 다 있으면 A
3. 한 번에 여러 스킬 결과 보기
SELECT d.ID,
d.EMAIL,
(d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) AS HAS_PYTHON,
(d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End')) AS HAS_FRONT,
(d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) AS HAS_CSHARP
FROM DEVELOPERS d;
여기서는 0이면 없음, >0 값이 나오면 해당 스킬 있음