Skip to main content

[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 값이 나오면 해당 스킬 있음