@V_Faver = '1' 이면 MM.PBLCYN = 'Y' 값이 나오고
@V_Faver = '2' 이고 @S_Gubun = '0' 이면 MM.SPCLYN 값이 'Y'
@V_Faver = '2' 이고 @S_Gubun = '1' 이면 MM.SPCLYN 값이 'Y' 이고 MM.HCODE 값이 'A'
@V_Faver = '2' 이고 @S_Gubun = '2' 이면 MM.SPCLYN 값이 'Y' 이고 MM.HCODE 값이 'B'인 값이 나오게 하려고 합니다
WHERE MM.SUP_NO IS NOT NULL
AND MM.PER_NM IS NOT NULL
AND MM.Sup_No LIKE 'T%'
AND CASE WHEN @V_Faver = '1' THEN MM.PBLCYN
WHEN @V_Faver = '2' THEN MM.SPCLYN ELSE 'Y' END = 'Y'
AND MM.REG_DT BETWEEN @V_RegFmDt AND @V_RegToDt
이것을 수정해서
WHERE MM.SUP_NO IS NOT NULL
AND MM.PER_NM IS NOT NULL
AND MM.Sup_No LIKE 'T%'
AND CASE WHEN @V_Faver = '1' THEN MM.PBLCYN
WHEN @V_Faver = '2' THEN MM.SPCLYN
WHEN @V_Faver = '2' AND @S_Gubun = '1' THEN MM.SPCLYN = 'Y' AND MM.HCODE = 'A'
WHEN @V_Faver = '2' AND @S_Gubun = '2' THEN MM.SPCLYN = 'Y' AND MM.HCODE = 'B' ELSE 'Y' END
AND MM.REG_DT BETWEEN @V_RegFmDt AND @V_RegToDt
이렇게 CASE 문을 바꿨더니 오류가 났습니다.. CASE문 자체가 잘못된거 같긴한데 CASE 문으로 이루어질수 있은것인지
아니면 다른문을 써야하는것인지 잘 모르겠습니다. 많은 도움 부탁드립니다.
Comment 4
-
자리비움
2014.07.08 11:49
-
아수라발발타
2014.07.08 13:32
1번 방법을 이용하고 싶은데 어떻게 하면 될까요...
초보라 손을 못 대고 있어요.. 빨간줄이 너무 많이 괴롭히고 있어요ㅜㅜ
-
자리비움
2014.07.08 15:58
실행계획과 분포도를 이해하고 계시다면 1번 방법의 선택을 고려해볼 수는 있겠으나
초보라 말씀하시니 아래 History 님의 의견대로 3번 방법을 이용하시는게 좋습니다.
(전문가도 1번 방법은 잘 안씁니다) -
Hisory
2014.07.08 13:40
조건문에 case 를 쓰는건 비추입니다.
해당 부분때문에 데이터 건수에 따라 db성능이 굉장히 안좋아 질수 있습니다
sp_executesql 을 사용하기를 권장해 드리며.. 간단한 내용은 아래링크를 참고하세여
WHERE MM.SUP_NO IS NOT NULL
AND MM.PER_NM IS NOT NULL
AND MM.Sup_No LIKE 'T%'
AND (
CASE WHEN @V_Faver = '1' THEN MM.PBLCYN
WHEN @V_Faver = '2' THEN MM.SPCLYN
ELSE 'Y'
END
) = 'Y'
AND MM.REG_DT BETWEEN @V_RegFmDt AND @V_RegToDt
개념.
기존 쿼리를 보시면 @V_Faver 값에 따라서 특정 컬럼에 'Y' 값에 대응을 시키고 있지만
수정하신 쿼리는 값에 대한 대입이 아니라 @V_Faver 값에 따라 조건을 분리하고 있습니다.
해결.
1. CASE WHEN 을 써야 한다면 CASE WHEN 조건 THEN ( CASE WHEN 조건.. ) 형태로 해결할 수도 있을 것 같습니다.
2. @V_Faver 파라미터에 따라서 상단에서 쿼리를 분리할 수도 있을 것 같습니다.
3. 동적 쿼리로 구성이 가능할 것 같습니다.