파라미터에 따라 쿼리 AND 조건 적용 유무를 쿼리로 작성 한다면 어떻게 해야 할까요? 0 5 828

by l폭주천사l [DB 기타] 파라미터 다이나믹 AND 조건 [2022.05.16 17:12:41]


분류 M Name Target
SU G L H
total total 24 13 23 28
Food sub-total 9 6 13 12
Food Food-Healthy A 5 3 6 10
Food Food-Healthy B 4 3 7 2
Beauty sub-total 15 7 10 16
Beauty Hair 7 3 7 11
Beauty Body 8 4 3 5

안녕하세요, 그루비 통해서 하나씩 하나씩 쿼리를 배워나가고 있는 유저 입니다..

쿼리를 짜다보니 상기와 같은 테이블에서 조건을 다이나믹 하게 줘여할 경우가 생겨 문의 드려봅니다. 

상기 테이블에서 파라미터로 분류와, M Name 그리고 SU/G/L/H 중에 한 값까지 총 3개의 파라미텉를 전달 받아 쿼리를 수행하여 각각

상세 데이터를 조회 하려고 합니다. 

Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3} 식의 쿼리가 될텐데요... 

그런데 중간에 Total, Sub-Total은 화면에 보여주기 위해서 집계를 낸 것이기 때문에 

Select * FROM 테이블 WHERE 분류 = {파람1} AND TARGET = {파람3} 형태의 쿼리가 되어야 합니다. 

중간에 AND M_NAME = {파람2} 조건이 없는 쿼리문으로 수행 되어야 하는데요. 

어떤식으로 쿼리를 작성해야 하는지 조언 부탁 드립니다. 

단 1개의 SQL문으로 3가지의 케이스를 커버 할 수 있어야 합니다. 

3가지 케이스는 - 파람1 이 Total 인 경우, 

                     - 파람2가 Sub-Total 인 경우

                     - 그외(파람 1, 파람2가 Total, Sub-Total이 아닌 경우)

by 우주민 [2022.05.16 17:47:34]

조건을 빼는 것이 아니라 해당 total / sub_total 값을 조회하지 못하도록 만드는게 맞지 않을까 싶은데요.

Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3}

and M_NAME not in ('total','sub-total')

로 설정하는 것이 맞아 보입니다.

 

... 그나저나 [TARGET = {파람3}] 이 부분의 조건식은 어떻게 처리될지 궁금하네요 


by l폭주천사l [2022.05.16 18:26:06]

제가 설명이 부족했네요... 3가지 케이스를 1개의 SQL문으로 작성 되어야 하는데.. 명시적으로 not in으로 해버리면 커버가 안되는 케이스가 발생 합니다 ㅠㅠ 


by 마농 [2022.05.16 18:34:21]

뭔가 설명이 이상합니다.
파람1,2,3 으로 3개로 들어오는 것 맞나요?
파람 하나에 3가지 조회구분이 들어가야 하는게 아닐런지?
target 은 또 뭔가요? 올려주신 테이블에는 안보이는데요?
질문을 정확하게 정리해 주셔야 합니다.
3가지 케이스별 조회결과 예를 들어 주세요.
원본 대비 조회조건에 따른 각각의 케이스별 결과표


by l폭주천사l [2022.05.16 19:22:56]

제가 설명이 부족했나 보네요.. 

부연 설명 드리면, 우선 표에서 Target 부분 추가 하였고, 표의 정보는 데이터가 아닌 파라미터로 넘어 갈 수 있는 매트릭스에 더 가까운것 같습니다.   

파라미터 는 총3개가 들어오게 되고, 3 가지 파라미터로 조회되는 원본 상세데이터가 조회 되어야 합니다. 

Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3}  쿼리를 수행

- 데이터 원본 상세

분류 M Name M ID Target Target ID Prod ID IDX
Food Food-Healthy A 1000 SU 1 101 100
Food Food-Healthy A 1000 SU 1 102 100
Food Food-Healthy A 1000 SU 1 103 100
Food Food-Healthy A 1000 SU 1 104 100
Food Food-Healthy A 1000 SU 1 301 100
Food Food-Healthy B 1100 SU 1 302 100
Food Food-Healthy B 1100 SU 1 105 100
Food Food-Healthy B 1100 SU 1 106 100
Food Food-Healthy B 1100 SU 1 107 100
Beauty Hair 1200 SU 1 108 100
Beauty Hair 1200 SU 1 109 100
Beauty Hair 1200 SU 1 110 100
Beauty Hair 1200 SU 1 111 100
Beauty Hair 1200 SU 1 112 100
Beauty Hair 1200 SU 1 113 100
Beauty Hair 1200 SU 1 114 100
Beauty Body 1300 SU 1 115 100
Beauty Body 1300 SU 1 116 100
Beauty Body 1300 SU 1 117 100
Beauty Body 1300 SU 1 118 100
Beauty Body 1300 SU 1 119 100
Beauty Body 1300 SU 1 120 100
Beauty Body 1300 SU 1 121 100
Beauty Body 1300 SU 1 122 100

- 조회 케이스 1 :

예를 들면 Food / Healthy A / SU에 교차되는 5를 클릭 하게 되면 Food / Healthy A / SU 정보가 파라미터로 넘어가게 되고

분류 M Name M ID Target Target ID Prod ID IDX
Food Food-Healthy A 1000 SU 1 101 100
Food Food-Healthy A 1000 SU 1 102 100
Food Food-Healthy A 1000 SU 1 103 100
Food Food-Healthy A 1000 SU 1 104 100
Food Food-Healthy A 1000 SU 1 301 100

 

- 조회 케이스 2:

여기서 문제는 Total / Total / SU 에 해당하는 24를 클릭하게 되면 파라미터 Total / Total은 상기 테이블 내에 존재 하지 않는 데이터 이고 합계를 의미이고

Select * FROM 테이블 WHERE TARGET = {파람3} 형태로 쿼리가 수행 되어야 합니다. (샘플을 Target이 SU인 경우만 예를 들어 원본 상세 데이터 목록과 동일 합니다. )

분류 M Name M ID Target Target ID Prod ID IDX
Food Food-Healthy A 1000 SU 1 101 100
Food Food-Healthy A 1000 SU 1 102 100
Food Food-Healthy A 1000 SU 1 103 100
Food Food-Healthy A 1000 SU 1 104 100
Food Food-Healthy A 1000 SU 1 301 100
Food Food-Healthy B 1100 SU 1 302 100
Food Food-Healthy B 1100 SU 1 105 100
Food Food-Healthy B 1100 SU 1 106 100
Food Food-Healthy B 1100 SU 1 107 100
Beauty Hair 1200 SU 1 108 100
Beauty Hair 1200 SU 1 109 100
Beauty Hair 1200 SU 1 110 100
Beauty Hair 1200 SU 1 111 100
Beauty Hair 1200 SU 1 112 100
Beauty Hair 1200 SU 1 113 100
Beauty Hair 1200 SU 1 114 100
Beauty Body 1300 SU 1 115 100
Beauty Body 1300 SU 1 116 100
Beauty Body 1300 SU 1 117 100
Beauty Body 1300 SU 1 118 100
Beauty Body 1300 SU 1 119 100
Beauty Body 1300 SU 1 120 100
Beauty Body 1300 SU 1 121 100
Beauty Body 1300 SU 1 122 100

 

- 조회 케이스 3:

Food / Sub-Total / SU에 해당하는 9를 클릭시에도 동일하게 합계를 의미하는 데이터 이고 Select * FROM 테이블 WHERE 분류 = {파람1}  AND TARGET = {파람3} 의 형태로 쿼리가 수행되어 합니다.

분류 M Name M ID Target Target ID Prod ID IDX
Food Food-Healthy A 1000 SU 1 101 100
Food Food-Healthy A 1000 SU 1 102 100
Food Food-Healthy A 1000 SU 1 103 100
Food Food-Healthy A 1000 SU 1 104 100
Food Food-Healthy A 1000 SU 1 301 100
Food Food-Healthy B 1000 SU 1 302 100
Food Food-Healthy B 1000 SU 1 105 100
Food Food-Healthy B 1000 SU 1 106 100
Food Food-Healthy B 1000 SU 1 107 100

 

위에 세가지 쿼리 케이스는 커버 할 수 있는 단일 쿼리를 작성해야 하는데. 어떤식으로 작성해야 할지 문의 드립니다. 

 

 


by 마농 [2022.05.16 22:30:14]
SELECT *
  FROM t
 WHERE :p_1 IN ('total', 분류)
   AND :p_2 IN ('total', 'sub-total', M_Name)
   AND :p_3 = target
;

 

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