오라클 WHERE 절에 CASE문 질문 드립니다. 0 5 6,484

by 시리 [SQL Query] [2017.02.10 09:54:06]


SELECT 
*
FROM product p, emp e
where e.grpcode = 
( case 
  when e.grpcode = 'MASTE' then 넘어가고
  when e.grpcode = 'ADMIN' then 넘어가고
  when e.grpcode = 'MIDLE' then e.dept_id가 p.dept_id랑 같아야 되고
  when e.grpcode = 'ILBAN' then e.emp_id가 p.emp_id랑 같아야 되고

)
 

이런 쿼리를 짜고 싶은데 방향이 안 잡혀서 질문 드립니다.

EMP : 로그인 아이디 정보를 가지고 있는 테이블 - 권한 (grpcode) 

PRODUCT : 실제 조회할 테이블
 

MASTE - 개발용 슈퍼유저

ADMIN - 관리자 (슈퍼유저)

MIDLE - 중간관리자 - 자기 부서 것만 조회 가능

ILBAN - 사용자 - 자기 아이디에 해당하는 것만 조회 가능

 

인데 어떤 식으로 짜는 것이 좋을까요 ㅠㅠ...

일단 where 절이 case 문은 가능한 것  같은데 저것을 어떻게 해야 할 지 방향이 안 잡힙니다...

 

 

 

 

SELECT 
*
FROM product p, emp e
where (
  (:파라미터로받아올grpno = 'A')
  or (:파라미터로받아올grpno =  'B' AND e.dept_id = p.dept_id)
  or (:파라미터로받아올grpno = 'C' AND e.emp_id = p.emp_id)
);

 

이것도 아닌 거 같아서요 ㅠㅠ...

by 시리 [2017.02.10 10:17:04]

앗 해결됬습니다!

case 문 사용 안하고 그냥 parameter로 받아와서 직접 구분해 주는 방식이었습니다 :D!


by 마농 [2017.02.10 10:23:29]
SELECT p.*
  FROM product p
     , emp e
 WHERE e.emp_id = :v_login_ID
   AND (  (e.grpcode IN ('MASTE', 'ADMIN'))
       OR (e.grpcode = 'MIDLE' AND e.dept_id = p.dept_id)
       OR (e.grpcode = 'ILBAN' AND e.emp_id  = p.emp_id )
       )
;

 


by jkson [2017.02.10 10:29:40]

좀 복잡하긴 하지만

만약 DEPT_ID, EMP_ID 가 PRODUCT의 인덱스 컬럼이고 FULLSCAN 비용이 생각보다 높다면

아래와 같이 하시면 인덱스 활용이 가능하실 겁니다.

SELECT *
  FROM PRODUCT
 WHERE EXISTS (SELECT 1
                 FROM EMP
                WHERE EMP_ID = :EMP_ID
                  AND GRPCODE IN ('MASTE', 'ADMIN'))
UNION ALL
SELECT *
  FROM PRODUCT A
 WHERE EXISTS (SELECT 1
                 FROM EMP B
                WHERE EMP_ID = :EMP_ID
                  AND GRPCODE IN ('MIDLE')
                  AND B.DEPT_ID = A.DEPT_ID)
UNION ALL
SELECT *
  FROM PRODUCT A
 WHERE EXISTS (SELECT 1
                 FROM EMP B
                WHERE EMP_ID = :EMP_ID
                  AND GRPCODE IN ('ILBAL')
                  AND B.E.EMP_ID = A.EMP_ID)

아.. 쓸데 없는 조인 필요 없이 그냥

EMP에서 GRPCODE 받아서 파라메터로 넘겨 주는 게 쿼리는 두번 실행하지만

조인 부담이 없으니 훨씬 낫겠네요.

SELECT *
  FROM PRODUCT
 WHERE :GRPCODE IN ('MASTE', 'ADMIN')
UNION ALL
SELECT *
  FROM PRODUCT A
 WHERE :GRPCODE IN ('MIDLE')
   AND DEPT_ID = :DEPT_ID
UNION ALL
 SELECT *
  FROM PRODUCT A
 WHERE :GRPCODE IN ('ILBAN')
   AND EMP_ID = :EMP_ID

 


by 마농 [2017.02.10 10:43:06]

NOT IN 은 실수 한 듯.


by jkson [2017.02.10 10:43:57]

수정했습니다. 감사합니다~~

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