rdb에서 배열을 저장하고 싶다면 어떻게 할까??
프로그래머스 sql문제에 좋은 예시가 있다
다른 테이블을 참조하여 모든 켜진 비트에 해당하는 ID를 찾으려면, 비트 연산을 활용하여 두 테이블을 JOIN해야 합니다. 이 경우, 한 테이블에는 ID와 비트 값(예: permissions), 다른 테이블에는 각 비트의 의미를 정의한 데이터가 포함됩니다.
예시 시나리오
- USERS 테이블: 사용자 ID와 권한(비트 값)이 저장됨
- PERMISSIONS 테이블: 각 비트의 의미를 정의한 테이블
테이블 정의
- USERS 테이블:
- id: 사용자 ID
- name: 사용자 이름
- permissions: 비트로 표현된 권한 값
CREATE TABLE USERS ( id INT PRIMARY KEY, name VARCHAR(50), permissions INT );
INSERT INTO USERS (id, name, permissions)
VALUES (1, 'Alice', 5), -- Binary: 101
(2, 'Bob', 2), -- Binary: 010
(3, 'Charlie', 7);-- Binary: 111
- PERMISSIONS 테이블:
- bit_value: 각 비트를 나타내는 정수 값(1, 2, 4, 8, …)
- description: 해당 비트가 의미하는 것
CREATE TABLE PERMISSIONS ( bit_value INT PRIMARY KEY, description VARCHAR(50) );
INSERT INTO PERMISSIONS (bit_value, description) VALUES (1, 'Can Edit'), (2, 'Can View'), (4, 'Can Delete');
켜진 비트에 해당하는 ID 찾기
USERS 테이블의 permissions 값이 PERMISSIONS 테이블의 bit_value와 일치하는 사용자 ID를 찾는 쿼리를 작성할 수 있습니다.
방법 1: JOIN과 WHERE 사용
이 방법은 USERS 테이블의 permissions 값이 PERMISSIONS 테이블의 각 bit_value에 대해 해당하는 사용자를 찾는 것입니다.
SELECT u.id, u.name, u.permissions, p.description
FROM USERS u
JOIN PERMISSIONS p ON u.permissions & p.bit_value = p.bit_value
ORDER BY u.id ASC, p.bit_value ASC;
설명
- JOIN 구문:
- USERS 테이블과 PERMISSIONS 테이블을 JOIN합니다. 여기서 조건은 u.permissions & p.bit_value = p.bit_value입니다.
- 이 조건은 USERS 테이블의 permissions 값에서 p.bit_value 비트가 켜져 있는 사용자를 찾습니다.
- 결과는 사용자의 ID, name, permissions 값과 그에 해당하는 비트의 설명(description)을 출력합니다.
결과 예시
예를 들어, 위의 데이터에서 Alice는 permissions = 5를 가지고 있습니다. 이는 이진수로 101이고, 첫 번째(1)와 세 번째(4) 비트가 켜져 있습니다. 따라서 결과는 Can Edit와 Can Delete 권한을 가진 사용자 Alice를 반환합니다.
+----+---------+-------------+-------------+
| id | name | permissions | description |
+----+---------+-------------+-------------+
| 1 | Alice | 5 | Can Edit |
| 1 | Alice | 5 | Can Delete |
| 2 | Bob | 2 | Can View |
| 3 | Charlie | 7 | Can Edit |
| 3 | Charlie | 7 | Can View |
| 3 | Charlie | 7 | Can Delete |
+----+---------+-------------+-------------+
정리
이 쿼리는 각 사용자의 permissions 값에서 켜진 비트에 해당하는 권한을 PERMISSIONS 테이블과 매칭하여 출력합니다. 이를 통해 어떤 사용자가 어떤 권한을 가지고 있는지 쉽게 확인할 수 있습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/276034
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건에 맞는 개발자 찾기
- and 연산을 사용해풀 수 있다
- distinct를 깜빡해 자꾸 실패가 떴음
아래 코드
둘 다 가능
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d
INNER JOIN SKILLCODES s ON d.SKILL_CODE & s.CODE = s.CODE
WHERE s.NAME = 'PYTHON' OR s.NAME = 'C#'
ORDER BY d.ID ASC
;
# SELECT DISTINCT
# d.ID,
# d.EMAIL,
# d.FIRST_NAME,
# d.LAST_NAME
# FROM
# DEVELOPERS d
# JOIN
# SKILLCODES s1 ON (d.SKILL_CODE & s1.CODE = s1.CODE)
# JOIN
# SKILLCODES s2 ON (d.SKILL_CODE & s2.CODE = s2.CODE)
# WHERE
# s1.NAME = 'Python'
# OR
# s2.NAME = 'C#'
# ORDER BY
# d.ID ASC;
'DB' 카테고리의 다른 글
SQL null의 처리 (5) | 2024.09.06 |
---|---|
SQL CTE (Common Table Expression) (0) | 2024.09.05 |
SQL in (0) | 2024.09.04 |
SQL union all (2) | 2024.09.04 |