MSSQL WHERE 절 Case 문 질문 0 2 1,477

by 보청기 [SQL Query] 쿼리 MSSQL [2021.10.27 15:22:27]


안녕하세요.

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.code1in ( ) 구문을 어떻게 적어야 할지 잘 모르겠습니다.

           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 )

선배님들의 조언을 부탁드리겠습니다.
감사합니다.

by 마농 [2021.10.27 16:00:52]

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
;

 


by 보청기 [2021.10.27 16:26:41]

너무 감사드리며 많은 공부와 도움 되었습니다. (--)(__)
 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입