[Oracle] 오라클 WHERE IN 리스트에 1000개 이상 사용하기 ORA-01795 maximum number of expressions in a list is 1000

먼저  WHERE IN 에 대해서 알아보자.

보통 특정 컬럼에 조건이 하나인 경우에는 다음과 같이 많이 사용한다.
SELECT NAME
FROM STUDENT
WHERE NAME = 'FWANTASTIC'




검색하려는 학생 이름이 여러 개라면  WHERE IN 을 사용하면 쉽다.
SELECT NAME
FROM STUDENT 
WHERE NAME IN ('FWANTASTIC', 'IU', 'BOO')


이  WHERE IN 에는 한가지 한계가 있는데,  IN ()  clause 안에는 최대 1000개까지만 넣을 수 다. 만약 1000개 이상을 집어넣고 쿼리를 실행해보면  ORA-01795 maximum number of expressions in a list is 1000  에러를 보게 된다.

분석이나 디버깅할 때  WHERE IN 을 많이 쓰는데 때에 따라 1000개 이상의 검색 조건을 달아야 할 때가 있는데, 그럴 땐 두 가지 방법이 있다.

 WHERE IN 에 많은 검색 조건을 사용할 땐 퍼포먼스 문제가 있을 수 있으니 대상 컬럼이 인덱스가 걸려있는지 확인하자.

첫 번째 방법 -  OR 을 사용하기

SELECT NAME
FROM STUDENT
WHERE NAME IN ('FWANTASTIC', 'IU', ...)
OR NAME IN ('BOO', 'LOVE ATTACK', ...)
OR NAME IN ('MARSHMELLOW', 'GOOD DAY')


이 방법의 단점은 1000개씩 끊어줘야 하는데 그게 좀 어렵지만 대신 직관적이라는 게 장점이다.


두 번째 방법 -  임시 테이블 에 값을 넣고 난 후  SELECT 로 가져오기

쿼리를 실행하기 전에 검색하려는 조건들을 TEMP_TABLE이라는 임시 테이블에 저장한 다음에 이 테이블을 검색 조건에 사용한다.
SELECT NAME
FROM STUDENT
WHERE NAME IN (SELECT NAME FROM TEMP_TABLE)


이 방법의 장점은 검색 필터가 늘어나도 쿼리 변경이 없으며 literal을 직접 기재하지 않아도 되니 쿼리가 더 간결해지고 가독성이 좋아진다.