mysql에서 중첩된 if 조건을 축약하는 방법이 궁금합니다. 0 2 158

by 찡스쿄 [MySQL] mysql if 중첩조건 [2021.01.08 11:00:55]


안녕하세요, 선배님들.

SELECT 절에서 같은 조건을 기준으로 여러 컬럼을 조회하는데요,

해당 쿼리문을 축약할 수 있는 방법이 있을까요?..

기존에 누군가가 작성해둔 SQL 쿼리인데.. 가독성도 떨어지고 쿼리 성능을 향상시킬 수 있는 방법이 있는지 조언을 얻어보고자 합니다!

쿼리는 다음과 같습니다.

SELECT A.COS_INV_SQ, A.COS_INV_QTY, A.COS_INV_GB, A.regDate, Z1.COS_STO_ZO_NM, Z2.COS_STO_NM,

		IF(A.COS_INV_GB ='품목', (SELECT COS_CLS01_NM FROM COS_CLS01 B2 WHERE B2.COS_CLS01_CD = B1.COS_CLS01_CD),
		IF(A.COS_INV_GB='원료', (SELECT COS_CLS01_NM FROM COS_CLS01 C2 WHERE C2.COS_CLS01_CD = C1.COS_CLS01_CD),
		IF(A.COS_INV_GB='부자재', (SELECT COS_CLS01_NM FROM COS_CLS01 D2 WHERE D2.COS_CLS01_CD = D1.COS_CLS01_CD), ''
		))) AS COS_CLS01_NM,
		IF(A.COS_INV_GB='품목', B1.COS_CTRY_NM,
		IF(A.COS_INV_GB='원료', C1.COS_RAW_MTRL_NM,
		IF(A.COS_INV_GB='부자재', D1.COS_SUB_RC_NM, ''
		))) AS COS_CTRY_NM,
		IF(A.COS_INV_GB='품목', B1.COS_ITEM_CD,
		IF(A.COS_INV_GB='원료', C1.COS_RAW_MTRL_CD,
		IF(A.COS_INV_GB='부자재', D1.COS_SUB_RC_CD, ''
		))) AS COS_ITEM_CD,
		IF(A.COS_INV_GB='품목', B1.COS_USE_FG,
		IF(A.COS_INV_GB='원료', C1.COS_USE_FG,
		IF(A.COS_INV_GB='부자재', D1.COS_USE_FG, ''
		))) AS COS_USE_FG,
		
		Z1.COS_STO_ZO_CD
		
		FROM COS_INV A
		LEFT OUTER JOIN COS_ITEM B1
		ON B1.COS_ITEM_CD = A.COS_ITEM_CD
		LEFT OUTER JOIN COS_RAW_MTRL C1
		ON C1.COS_RAW_MTRL_CD = A.COS_RAW_MTRL_CD
		LEFT OUTER JOIN COS_SUB_RC D1
		ON D1.COS_SUB_RC_CD = A.COS_SUB_RC_CD
		INNER JOIN COS_STO_ZO Z1
		ON A.COS_STO_ZO_CD = Z1.COS_STO_ZO_CD
		INNER JOIN COS_STO Z2
		ON Z1.COS_STO_CD = Z2.COS_STO_CD
		WHERE 1=1 AND A.COS_INV_QTY NOT IN (0)
		ORDER BY A.COS_INV_SQ DESC
		LIMIT 0, 20;

품목, 원료, 부자재별로 같은 조건임에도 불구하고 여러 개의 if 함수가 포함되어 있는데,

해당 쿼리의 성능을 향상시킬 수 있는 방법이 있을까요?

답변 미리 감사드립니다. ^^~

by 마농 [2021.01.08 11:21:07]
SELECT a.cos_inv_sq
     , a.cos_inv_qty
     , a.cos_inv_gb
     , a.regdate
     , z1.cos_sto_zo_nm
     , z2.cos_sto_nm
     , e1.cos_cls01_nm
     , CASE a.cos_inv_gb
       WHEN '품목'   THEN b1.cos_ctry_nm
       WHEN '원료'   THEN c1.cos_raw_mtrl_nm
       WHEN '부자재' THEN d1.cos_sub_rc_nm
       ELSE '' END AS cos_ctry_nm
     , CASE a.cos_inv_gb
       WHEN '품목'   THEN b1.cos_item_cd
       WHEN '원료'   THEN c1.cos_raw_mtrl_cd
       WHEN '부자재' THEN d1.cos_sub_rc_cd
       ELSE '' END AS cos_item_cd
     , CASE a.cos_inv_gb
       WHEN '품목'   THEN b1.cos_use_fg
       WHEN '원료'   THEN c1.cos_use_fg
       WHEN '부자재' THEN d1.cos_use_fg
       ELSE '' END AS cos_use_fg
     , z1.cos_sto_zo_cd
  FROM cos_inv a
  LEFT OUTER JOIN cos_item b1
    ON b1.cos_item_cd = a.cos_item_cd
  LEFT OUTER JOIN cos_raw_mtrl c1
    ON c1.cos_raw_mtrl_cd = a.cos_raw_mtrl_cd
  LEFT OUTER JOIN cos_sub_rc d1
    ON d1.cos_sub_rc_cd = a.cos_sub_rc_cd
  LEFT OUTER JOIN cos_cls01 e1
    ON e1.cos_cls01_cd = CASE a.cos_inv_gb
                         WHEN '품목'   THEN b1.cos_cls01_cd
                         WHEN '원료'   THEN c1.cos_cls01_cd
                         WHEN '부자재' THEN d1.cos_cls01_cd
                          END
 INNER JOIN cos_sto_zo z1
    ON a.cos_sto_zo_cd = z1.cos_sto_zo_cd
 INNER JOIN cos_sto z2
    ON z1.cos_sto_cd = z2.cos_sto_cd
 WHERE 1=1
   AND a.cos_inv_qty NOT IN (0)
 ORDER BY a.cos_inv_sq DESC
 LIMIT 0, 20
;

 


by 찡스쿄 [2021.01.08 11:31:25]

마농 선생님 답변 감사드립니다.

커뮤니티 방문할 때마다 매번 선생님께 커다란걸 배워가네요 ㅠㅠ..

새해 복 많이 받으시고, 항상 좋은 일만 가득하시길 바라요. ^^

코로나 조심하시고, 즐거운 주말 보내세요!

감사합니다. ^^ (꾸벅)

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