안녕하세요.
MSSQL 에 프로시저에서 WHERE 절에 Case 문 사용이 잘 안되서 질문 좀 드리겠습니다.
------------------ 사용한 쿼리문 ---------------------------------------------------------------------------------------
select a.code1 as depth1_code
,a.code_name_kor as depth1_name
,b.code1 as depth2_code
,b.code_name_kor as depth2_name
from dbo.Code_Master as a with(nolock)
inner join dbo.Code_Master as b with(nolock)
on b.code_group='Menu'
and b.code_kind='depth2'
and ( case when @srch_mem_grade='99'
then 1=1
else b.code1 in ( select menu_code
from dbo.Members_Menus with(nolock)
where mem_no=@srch_mem_no
and is_gubun='1')
end )
and a.code1=Left(b.code1,2)
where 1=1
and a.code_group='Menu'
and a.code_kind='depth1'
order by depth2_code
-----------------------------------------------------------------------------------------------------------------------------------------------------
위 처럼 하니 오류가 나서 아래처럼 바꾸려고 하니... @srch_mem_grade 변수 값이 '99' 가 아닐때는 = 대신 in 을 적어야 되는데...
b.code1 의 in ( ) 구문을 어떻게 적어야 할지 잘 모르겠습니다.
and ( case when @srch_mem_grade='99' then 1 else b.code1 end )
= ( case when @srch_mem_grade='99'
then 1 else ( select menu_code
from dbo.Members_Menus with(nolock)
where mem_no=@srch_mem_no
and is_gubun='1')
end )
선배님들의 조언을 부탁드리겠습니다.
감사합니다.
1. 조건의 위치를 구분하는게 좋습니다.
- 조인조건은 ON 절에
- 필터조건은 WHERE 절에
2. 굳이 CASE 를 쓸 필요 없이 AND/OR 를 적절하게 이용하시면 됩니다.
SELECT a.code1 AS depth1_code , a.code_name_kor AS depth1_name , b.code1 AS depth2_code , b.code_name_kor AS depth2_name FROM dbo.Code_Master a WITH(NOLOCK) INNER JOIN dbo.Code_Master b WITH(NOLOCK) ON a.code1 = LEFT(b.code1, 2) WHERE 1=1 AND a.code_group = 'Menu' AND a.code_kind = 'depth1' AND b.code_group = 'Menu' AND b.code_kind = 'depth2' AND ( @srch_mem_grade = '99' OR b.code1 IN (SELECT menu_code FROM dbo.Members_Menus WITH(NOLOCK) WHERE mem_no = @srch_mem_no AND is_gubun = '1' ) ) ORDER BY depth2_code ;