본문 바로가기
데이터베이스/MSSQL

WHERE 절에 변수나 파라미터로 데이터 필터링하기 팁

by 브래드.권 2013. 9. 11.

 

 

WHERE 절에서 변수나 파라미터로 데이터 필터링할 때 변수 혹은 파라미터가 꼭 사용은 되어야 하나 빈 값일 경우 필터링하지 않고 값이 있을 경우에만 필터링 할 경우 유용한 팁입니다.

 

 

예제 쿼리문

-- 예제를 위한 테이블 변수 생성
DECLARE @tmpTable TABLE (
	idx INT,
	idx_Name VARCHAR(30)
)

-- 테이블 변수에 데이터 생성
INSERT INTO @tmpTable VALUES(1, '테스트1')
INSERT INTO @tmpTable VALUES(2, '테스트2')
INSERT INTO @tmpTable VALUES(3, '테스트3')
INSERT INTO @tmpTable VALUES(4, '테스트33')
INSERT INTO @tmpTable VALUES(5, '테스트333')

-- 전체 데이터 조회
SELECT * FROM @tmpTable

-- 변수 생성
DECLARE @param VARCHAR(30)
SET @param = '테스트3'

-- 1. LIKE 문을 이용한 필터링
SELECT  * 
FROM     @tmpTable 
WHERE   idx_Name LIKE '%' + @param + '%'

-- 2. CASE 문을 이용한 필터링
SELECT  * 
FROM     @tmpTable 
WHERE   (CASE WHEN @param='' THEN '' ELSE idx_Name END) 
             = (CASE WHEN @param='' THEN '' ELSE @param END)

-- 3. OR 를 이용한 필터링
SELECT  * 
FROM    @tmpTable 
WHERE  (@param='' OR idx_Name = @param)

 

예제 결과

 

일반적으로 빈 값일 경우 필터링 하지 않기 위해 1번과 같이 LIKE 문을 사용하여 필터링을 하는 경우가 많은데 LIKE 연산자는 해당 문자열이 포함되어 있는 모든 데이터를 조회하기 때문에 위 예제와 같이 '테스트3' 만 가져오려 할 때 '테스트33', '테스트333' 을 모두 가져오는 오류가 발생할 수 있습니다.

 

빈 값이 아닐 경우 해당되는 데이터만 가져오게 할 경우에는 2번, 3번과 같은 방법으로 필터링할 수 있습니다.

 

두 가지 모두 동일하게 작동하나 3번이 훨씬 단순하고 오류 발생 확률이 작은 것 같네요.

3번의 경우 @param='' 을 맨 앞에 써주는 게 좋습니다.

왜냐하면 OR 조건은 둘 중 하나가 참이면 참이기 때문에 첫번째 조건이 참이면 두번째 조건은 무시하기 때문에 불필요한 IO를 막을 수 있기 때문입니다.