조건절 case when 질문입니다 0 7 168

by Kaiger [SQL Query] [2020.07.30 16:44:56]


SELECT * FROM TABLE J
WHERE 1=1
AND CASE WHEN J.ORG_CD != NULL THEN 
            ( 
                NVL(J.DUTY_CD, ' ') = '004'
                OR NVL(J.JOB_CLASS_CD, ' ' ) = ''
                OR NVL(J.ORG_CD, ' ' ) = '036101'
            ) 
                 ELSE (
                NVL(J.DUTY_CD, ' ') = '004'
                AND NVL(J.ORG_CD, ' ' ) = '036101'
            )
            END

 

안녕하세요

 

조건절에 위와 같은 쿼리가 가능할까요??

by 마농 [2020.07.30 17:12:17]

1. NULL 비교
  != NULL 은 잘못된 조건으로 항상 거짓이 됩니다.
  NULL 비교는 IS NULL / IS NOT NULL 을 사용해야 합니다.
  오라클에서의 '' 은 NULL 과 동일합니다.
  = '' 도 마찬가지로 잘못된 조건입니다.
2. NVL 처리는 왜 하는건지 모르겠네요?
  불필요한 처리입니다.
3. 전체적인 조건이 이해가 가지 않는 조건입니다.
  원하시는 조건을 말로 풀어서 해주세요.
  CASE 없이도 AND 와 OR 와 괄호로 원하시는 조건을 줄 수 있습니다.


by Kaiger [2020.07.30 17:16:38]
J.ORG_CD is not null 인경우

SELECT * FROM TABLE J

WHERE 1=1

and (
         NVL(J.DUTY_CD, ' ') = '004'
         OR NVL(J.JOB_CLASS_CD, ' ' ) = ''
         OR NVL(J.ORG_CD, ' ' ) = '036101'
     )



J.ORG_CD is null 인경우

SELECT * FROM TABLE J

WHERE 1=1

and (
         NVL(J.DUTY_CD, ' ') = '004'
         AND NVL(J.ORG_CD, ' ' ) = '036101'
        )

를 표현하려고 합니다.

 


by 마농 [2020.07.30 17:23:30]

말이 안되는 조건도 포함이 되어 있고, 불필요한 부분도 많이 보입니다.
NVL 처리는 불필요한 처리입니다.
OR NVL(J.JOB_CLASS_CD, ' ' ) = '' <--- 이 조건은 절대로 참이 될 수 없는 조건으로 빼도 되는 조건입니다.
J.ORG_CD is null 인경우에
AND NVL(J.ORG_CD, ' ' ) = '036101' 이 조건은 절대로 참이 될 수 없는 조건으로
J.ORG_CD is null 인경우에 하위 조건을 만족할 수 있는 경우가 절대로 없습니다.
조건을 전반적으로 잘못 파악하고 계신 것 같네요.

위 요구사항을 오류를 머금은 채로 그대로 반영한다면?
조건은 다음과 같이 간략화 됩니다.

SELECT *
  FROM table j
 WHERE 1=1
   AND j.org_cd IS NOT NULL
   AND (j.duty_cd = '004' OR j.org_cd = '036101')
;

하지만 이게 원하는 조건은 아닐 것으로 생각됩니다.
말도 안되는 오류 쿼리로 질문하지 마시고.
그냥 요구사항을 우리말로 풀어서 적어 보세요.


by Kaiger [2020.07.31 10:06:47]

 

id       duty_cd       org_cd

1149    004               
1150    004            027300
1150    004            036101
1150    004            039001
 

데이터 입니다.

id 를 가져오려고 하는데 org_cd 가 있으면 duty_cd = #param1# and org_cd = #param2#

두개의 조건이 걸려 해당하는 id 를 가져올 것이고 ( 둘다 있으면 1150을 가져오고)

없을 경우 duty_cd = #param1# 만 데이터가 있기 때문에 1149 를 가져옵니다

duty_cd 는 항상 값이 있고 org_cd 는 없을 수도 있습니다

 

 


by 마농 [2020.07.31 10:49:36]

조건으로 들어 오는 값이 항상 2개 파라미터 인가요?
두개 파라미터에 들어오는 값의 예시 자료 여러 Case 의 조합과
해당 Case 별 나와야 하는 결과자료를
원본테이블과, 입력 조건 대비 결과표 형태로 보여 주세요.


by 마농 [2020.07.31 13:36:12]
WITH t AS
(
SELECT 1149 id, '004' duty_cd, '' org_cd FROM dual
UNION ALL SELECT 1150, '004', '027300' FROM dual
UNION ALL SELECT 1150, '004', '036101' FROM dual
UNION ALL SELECT 1150, '004', '039001' FROM dual
)
SELECT *
  FROM t
 WHERE duty_cd = :p_duty_cd
   AND NVL(org_cd, 'x') = NVL(:p_org_cd, 'x')
;

 


by Kaiger [2020.07.31 16:38:31]

답변 감사드립니다.

참고하여서 수정하였습니다

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