Develop

[PostgreSQL] 다중 컬럼 IN 쿼리 사용 방법

issuemaker99 2025. 2. 12. 15:53
728x90

PostgreSQL에서 IN 절을 사용할 때 보통 단일 컬럼을 대상으로 사용합니다. 하지만 다중 컬럼을 대상으로 IN을 사용하려면 **튜플(ROW VALUE CONSTRUCTOR)**을 활용해야 합니다.


1. 다중 컬럼 IN 쿼리 사용 방법

📌 예제 테이블 생성

먼저 예제 테이블을 생성하겠습니다.

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    first_name TEXT,
    last_name TEXT,
    department TEXT
);

 

📌 샘플 데이터 삽입

INSERT INTO employees (first_name, last_name, department) VALUES
('John', 'Doe', 'HR'),
('Jane', 'Smith', 'IT'),
('Michael', 'Brown', 'Finance'),
('Emily', 'Davis', 'IT'),
('Chris', 'Wilson', 'HR');

 

📌 다중 컬럼 IN 사용 예제

예를 들어, (first_name, last_name)이 특정 값들과 일치하는 직원들을 찾고 싶다면 다음과 같이 작성할 수 있습니다.

SELECT * FROM employees
WHERE (first_name, last_name) IN (('John', 'Doe'), ('Jane', 'Smith'));

 

✅ 실행 결과:

id first_name last_name department
1 John Doe HR
2 Jane Smith IT

2. 다중 컬럼 IN을 대체할 수 있는 다른 방식

🔹 EXISTS 서브쿼리 사용

다중 컬럼 비교를 수행하는 또 다른 방법은 EXISTS를 활용하는 것입니다.

SELECT * FROM employees e
WHERE EXISTS (
    SELECT 1 FROM (VALUES ('John', 'Doe'), ('Jane', 'Smith')) AS t(first_name, last_name)
    WHERE e.first_name = t.first_name AND e.last_name = t.last_name
);

 

이 방식은 비교해야 할 값이 많을 때 성능이 더 나을 수도 있습니다.


🔹 JOIN을 이용한 방법

또 다른 방법으로, 비교할 데이터가 많은 경우 임시 테이블이나 VALUES를 사용한 JOIN을 활용할 수도 있습니다.

SELECT e.*
FROM employees e
JOIN (VALUES ('John', 'Doe'), ('Jane', 'Smith')) AS v(first_name, last_name)
ON e.first_name = v.first_name AND e.last_name = v.last_name;

 

이 방식은 데이터셋이 클 때 IN 절보다 최적화된 성능을 제공할 수 있습니다.


3. 정리

방법 설명 장점 단점
다중 컬럼 IN (col1, col2) IN ((val1, val2), (val3, val4)) 간단한 문법 값이 많을 경우 성능 저하 가능
EXISTS 서브쿼리 서브쿼리를 활용하여 다중 컬럼 비교 유연한 조건 추가 가능 다소 복잡한 문법
JOIN 활용 JOIN을 이용해 비교 값 매칭 최적화 가능, 대량 데이터에 적합 JOIN이 필요
LIST