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 에도 걸어서 구분하는 방법이 있을 것 같고, 혹은 조건 없이 모든 결과 데이터 조회하고 클라이언트에서 처리하는 방법이 떠올랐습니다.
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 ;