쿼리를 작성하다 조건을 여러개 걸어야 할 경우가 발생하였다.

다음과 같이 조건을 여러개 처리하기 위한 사전조건이 주어지고 해당 리스트를 뽑아야한다면

어떤방법으로 뽑을수 있을지 생각해보았다.



사전조건 


1.    a.cmpn_type_cd in('101','102','103') 캠페인유형이 이벤트1, 이벤트2, 이벤트3 가져와야함.


2.    이벤트3의 추첨유형은 c.draw_way_cd = '30' 인 랜덤추첨인것만 뽑아야함.


3.    c.draw_way_cd 는 10(추첨안함), 20(바로추첨), 30(랜덤추첨), null 등의 값이 들어감.


결론: 


이벤트1, 이벤트2는 모든추첨유형의 리스트를 가져와야하고 이벤트3은 랜덤추첨유형의 리스트를 가져와야함.




1. where case문 사용하기




1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- where 이후 case문을 사용한 처리
SELECT a.cmpn_no         -- 캠페인번호
     , a.cmpn_type_cd    -- 캠페인유형
     , a.cmpn_nm        -- 이벤트명
     , c.draw_way_cd    -- 추첨유형
  FROM cmpn_table a 
 inner join evnt_dtl c    -- 이벤트 내역
    on a.cmpn_no = c.cmpn_no
 WHERE 1=1
   and a.cmpn_type_cd in ('101''102','103')
   -- 캠페인유형이 이벤트3일경우 추첨유형값이 랜덤추첨(30)인 경우만 뽑고
   -- 캠페인유형이 이벤트3이 아닐경우 모두 30으로 빠지므로 조건에 걸리지 않음.
   and '30' = case when a.cmpn_type_cd = '103' then c.draw_way_cd else '30' end
;
cs


2. or문 사용하기



1
2
3
4
5
6
7
8
9
10
11
12
-- where 이후 or을 사용해 대괄호로 묶어 조건걸기
SELECT a.cmpn_no         -- 캠페인번호
     , a.cmpn_type_cd    -- 캠페인유형
     , a.cmpn_nm        -- 이벤트명
     , c.draw_way_cd    -- 추첨유형
  FROM cmpn_table a         -- 캠페인테이블
 inner join evnt_dtl c    -- 이벤트 내역
    on a.cmpn_no = c.cmpn_no
 WHERE 1=1
  -- 전체 대괄호를 사용해 이벤트1, 이벤트2 리스트를 뽑고 이벤트3은 랜덤추첨유형인것으로 뽑기
   and (a.cmpn_type_cd in ('101''102') or (a.cmpn_type_cd = 103 and c.draw_way_cd = '30')) -- or 합집합, and 교집합
;
cs


다음과 같이 쿼리를 사용하여 where 조건절 안에서 

이벤트1(모든유형), 이벤트2,(모든유형), 이벤트3(랜덤추첨유형) 의 리스트를 가져오는것을 확인할수 있었다.




+ Recent posts