쿼리를 작성하다 조건을 여러개 걸어야 할 경우가 발생하였다.
다음과 같이 조건을 여러개 처리하기 위한 사전조건이 주어지고 해당 리스트를 뽑아야한다면
어떤방법으로 뽑을수 있을지 생각해보았다.
사전조건
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(랜덤추첨유형) 의 리스트를 가져오는것을 확인할수 있었다.
'전체 > MySQL' 카테고리의 다른 글
ANSI Syntax and Conventional syntax(non-ANSI) 안시조인 사용 이유 (0) | 2018.10.29 |
---|---|
group by 이해하기 (0) | 2018.10.24 |
쿼리에서 select해서 update하기, 쿼리에서 select한 값을 list로 받아와서 update하기 (0) | 2018.06.07 |
MySQL 부등호 비교, 만 나이 구하는 쿼리 (0) | 2018.05.15 |
MySQL 테이블 컬럼 커멘트 보기 (0) | 2018.04.30 |