오라클 where절 조건검색 방법문의 드립니다. 0 3 1,530

by 디비초보 [Oracle 기초] [2019.03.04 11:36:34]


안녕하세요 테이블 컬럼이 날짜 데이터를 갖고있습니다.

2개의 컬럼중(둘다 날짜데이터) 첫번재 기준이 되는 컬럼이 널이아니라면 1번컬럼에서 검색

1번컬럼이 널이라면 2번컬럼에서 검색을 하고싶습니다.

 

그래서 구상해본 쿼리가.. 이하입니다.

select * from table a

where 1=1

and a.date1 = case when a.date1 not null then

a.date1 >= to_char(add_months(sysdate, -36), 'YYYYMMDD')

else

a.date2 >= to_char(add_months(sysdate, -36), 'YYYYMMDD')

end

 

이렇게 하면 될줄알았는데.. 문법에러가 나네요 case문은 이렇게 사용하지 못하는건가요?

제가 다른 쿼리를 구상해봤는데요~ 문제가 없는거 같아서 확인차 문의드립니다.

이하처럼 쿼리를 구상하면 될까요?

 

and (

(a.date1 is not null and (a.date1 >= to_char(add_months(sysdate, -36), 'YYYYMMDD') ) )

or

(a.date1 is null and (a.date2 >= to_char(add_months(sysdate, -36), 'YYYYMMDD') ) )

)

 

감사합니다.

by 신이만든지기 [2019.03.04 12:23:02]
WITH
    T AS
        (SELECT '20170101' DATE1, '20180201' DATE2 FROM DUAL
         UNION ALL
         SELECT NULL DATE1, '20170201' DATE2
           FROM DUAL
         UNION ALL
         SELECT '20180101' DATE1, NULL DATE2
           FROM DUAL)
SELECT *
  FROM T
 WHERE 1=1 
   AND NVL(DATE1, DATE2) >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYYMMDD')
   -- AND CASE WHEN DATE1 IS NOT NULL THEN DATE1 ELSE DATE2 END >= TO_CHAR(ADD_MONTHS(SYSDATE, -36), 'YYYYMMDD')

 


by 신이만든지기 [2019.03.04 12:26:51]

질문자님께서 2번째에 기술하신 방법대로 해도, 무방합니다.


by 디비초보 [2019.03.04 13:04:57]

앗.. 이렇게 하니 문제가 하나있었습니다..

date1은 데이터가 무조건 존재합니다. date2는 널일경우가 있습니다.

무조건 3년이 지난 데이터는 안보여야 한다는게 전제조건이였습니다..

data1이 널이지만 date2가 3년이 지난 데이터는 안보여야 합니다~

아.. 제가 생각을 잘못한거같네요..ㅎㅎ 위와같은 쿼리로하면 되는거였습니다..

 

답변자님께서 알려주신 쿼리가 더 심플하니 훌륭하네요 감사합니다.

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