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를 막을 수 있기 때문입니다.
'데이터베이스 > MSSQL' 카테고리의 다른 글
대소문자 구별하여 조회하기 (0) | 2013.11.05 |
---|---|
Login 계정과 DB 사용자 계정 강제 연결하기 (0) | 2013.03.27 |
yyyymmddhhmmss 형식으로 된 시간 문자열을 datetime 형식으로 변환하는 방법 (0) | 2013.03.27 |
[2000/2005] MD5 암호화 사용하기 (0) | 2013.03.27 |
DB 개체들의 의존성 확인하기 (0) | 2013.03.26 |