where 절에 case when 조건문 0 2 5,039

by COMAVLER [SQLServer] MSSQL CASE WHERE [2023.04.20 16:09:25]


SELECT WHATS = (CASE WHEN A.SALE_QTY <> 0 AND ISNULL(G.QTY, 0) = 0 THEN (SELECT CD_NM FROM BA100T WHERE MAJOR_CD = 'S060' AND MINOR_CD = '4')
					    WHEN A.SALE_QTY = G.QTY THEN (SELECT CD_NM FROM BA100T WHERE MAJOR_CD = 'S060' AND MINOR_CD = '1')
					    WHEN A.SALE_QTY > ISNULL(G.QTY, 0) THEN (SELECT CD_NM FROM BA100T WHERE MAJOR_CD = 'S060' AND MINOR_CD = '3')
					    WHEN A.SALE_QTY < ISNULL(G.QTY, 0) THEN (SELECT CD_NM FROM BA100T WHERE MAJOR_CD = 'S060' AND MINOR_CD = '2') END)
FROM A_TABLE 

이처럼 구성된 쿼리문이 있는데 이 'WHATS'라는 컬럼의 값에 조건을 걸어서 해당하는 값의 결과만 받고 싶습니다.
어떻게 하는 것이 가장 좋은 방법일까요..?

저는 WHATS 컬럼을 구분하는 CASE의 조건을 WHERE 에도 걸어서 구분하는 방법이 있을 것 같고, 혹은 조건 없이 모든 결과 데이터 조회하고 클라이언트에서 처리하는 방법이 떠올랐습니다.

by 마농 [2023.04.20 17:19:45]

1. CASE 문 그대로 WHERE 절에 사용 할 수 있습니다. 다만, 복잡한 구문이 반복적으로 사용이 되죠.
2. 인라인뷰를 사용하면 간단한 알리아스에 조건 줄 수 있습니다.
 

--  CASE 구문을 조금 다르게 구성해 봤습니다. (서브쿼리 4회 -> 1회)
SELECT *
  FROM (SELECT ...
             , (SELECT cd_nm
                  FROM ba100t
                 WHERE major_cd = 'S060'
                   AND minor_cd = CASE WHEN a.sale_qty <> 0 AND ISNULL(g.qty, 0) = 0 THEN '4'
                                       WHEN a.sale_qty = G.QTY                       THEN '1'
                                       WHEN a.sale_qty > ISNULL(g.qty, 0)            THEN '3'
                                       WHEN a.sale_qty < ISNULL(g.qty, 0)            THEN '2'
                                   END
                ) AS whats
          FROM a_table a
          JOIN g_table g
         ...
        ) a
 WHERE ...
   AND whats = @whats
;

-- 서브쿼리를 조인으로 풀어 볼 수도 있습니다.
SELECT ...
     , x.cd_nm AS whats
  FROM a_table a
  JOIN g_table g
  JOIN ba100t  x
    ON x.major_cd = 'S060'
   AND x.minor_cd = CASE WHEN a.sale_qty <> 0 AND ISNULL(g.qty, 0) = 0 THEN '4'
                         WHEN a.sale_qty = G.QTY                       THEN '1'
                         WHEN a.sale_qty > ISNULL(g.qty, 0)            THEN '3'
                         WHEN a.sale_qty < ISNULL(g.qty, 0)            THEN '2'
                     END
 WHERE ...
   AND x.cd_nm = @whats
;

 


by COMAVLER [2023.04.20 21:09:57]

감사합니다 마농님!
저는 두번째 이야기하신 것처럼 서브쿼리를 조인으로 풀어서 사용했습니다.

훨씬 수월하네요. 감사합니다.

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